diff options
Diffstat (limited to 'arch/powerpc/include/asm/exception-64s.h')
-rw-r--r-- | arch/powerpc/include/asm/exception-64s.h | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 243ce69ad685..66830618cc19 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -301,9 +301,12 @@ do_kvm_##n: \ | |||
301 | beq 4f; /* if from kernel mode */ \ | 301 | beq 4f; /* if from kernel mode */ \ |
302 | ACCOUNT_CPU_USER_ENTRY(r9, r10); \ | 302 | ACCOUNT_CPU_USER_ENTRY(r9, r10); \ |
303 | SAVE_PPR(area, r9, r10); \ | 303 | SAVE_PPR(area, r9, r10); \ |
304 | 4: std r2,GPR2(r1); /* save r2 in stackframe */ \ | 304 | 4: EXCEPTION_PROLOG_COMMON_2(area) \ |
305 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ | 305 | EXCEPTION_PROLOG_COMMON_3(n) \ |
306 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ | 306 | ACCOUNT_STOLEN_TIME |
307 | |||
308 | /* Save original regs values from save area to stack frame. */ | ||
309 | #define EXCEPTION_PROLOG_COMMON_2(area) \ | ||
307 | ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \ | 310 | ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \ |
308 | ld r10,area+EX_R10(r13); \ | 311 | ld r10,area+EX_R10(r13); \ |
309 | std r9,GPR9(r1); \ | 312 | std r9,GPR9(r1); \ |
@@ -318,11 +321,16 @@ do_kvm_##n: \ | |||
318 | ld r10,area+EX_CFAR(r13); \ | 321 | ld r10,area+EX_CFAR(r13); \ |
319 | std r10,ORIG_GPR3(r1); \ | 322 | std r10,ORIG_GPR3(r1); \ |
320 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \ | 323 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \ |
324 | GET_CTR(r10, area); \ | ||
325 | std r10,_CTR(r1); | ||
326 | |||
327 | #define EXCEPTION_PROLOG_COMMON_3(n) \ | ||
328 | std r2,GPR2(r1); /* save r2 in stackframe */ \ | ||
329 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ | ||
330 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ | ||
321 | mflr r9; /* Get LR, later save to stack */ \ | 331 | mflr r9; /* Get LR, later save to stack */ \ |
322 | ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ | 332 | ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ |
323 | std r9,_LINK(r1); \ | 333 | std r9,_LINK(r1); \ |
324 | GET_CTR(r10, area); \ | ||
325 | std r10,_CTR(r1); \ | ||
326 | lbz r10,PACASOFTIRQEN(r13); \ | 334 | lbz r10,PACASOFTIRQEN(r13); \ |
327 | mfspr r11,SPRN_XER; /* save XER in stackframe */ \ | 335 | mfspr r11,SPRN_XER; /* save XER in stackframe */ \ |
328 | std r10,SOFTE(r1); \ | 336 | std r10,SOFTE(r1); \ |
@@ -332,8 +340,7 @@ do_kvm_##n: \ | |||
332 | li r10,0; \ | 340 | li r10,0; \ |
333 | ld r11,exception_marker@toc(r2); \ | 341 | ld r11,exception_marker@toc(r2); \ |
334 | std r10,RESULT(r1); /* clear regs->result */ \ | 342 | std r10,RESULT(r1); /* clear regs->result */ \ |
335 | std r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ \ | 343 | std r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ |
336 | ACCOUNT_STOLEN_TIME | ||
337 | 344 | ||
338 | /* | 345 | /* |
339 | * Exception vectors. | 346 | * Exception vectors. |