|
@@ -301,9 +301,12 @@ do_kvm_##n: \
|
|
|
beq 4f; /* if from kernel mode */ \
|
|
|
ACCOUNT_CPU_USER_ENTRY(r9, r10); \
|
|
|
SAVE_PPR(area, r9, r10); \
|
|
|
-4: std r2,GPR2(r1); /* save r2 in stackframe */ \
|
|
|
- SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
|
|
|
- SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
|
|
|
+4: EXCEPTION_PROLOG_COMMON_2(area) \
|
|
|
+ EXCEPTION_PROLOG_COMMON_3(n) \
|
|
|
+ ACCOUNT_STOLEN_TIME
|
|
|
+
|
|
|
+/* Save original regs values from save area to stack frame. */
|
|
|
+#define EXCEPTION_PROLOG_COMMON_2(area) \
|
|
|
ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \
|
|
|
ld r10,area+EX_R10(r13); \
|
|
|
std r9,GPR9(r1); \
|
|
@@ -318,11 +321,16 @@ do_kvm_##n: \
|
|
|
ld r10,area+EX_CFAR(r13); \
|
|
|
std r10,ORIG_GPR3(r1); \
|
|
|
END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \
|
|
|
+ GET_CTR(r10, area); \
|
|
|
+ std r10,_CTR(r1);
|
|
|
+
|
|
|
+#define EXCEPTION_PROLOG_COMMON_3(n) \
|
|
|
+ std r2,GPR2(r1); /* save r2 in stackframe */ \
|
|
|
+ SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
|
|
|
+ SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
|
|
|
mflr r9; /* Get LR, later save to stack */ \
|
|
|
ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \
|
|
|
std r9,_LINK(r1); \
|
|
|
- GET_CTR(r10, area); \
|
|
|
- std r10,_CTR(r1); \
|
|
|
lbz r10,PACASOFTIRQEN(r13); \
|
|
|
mfspr r11,SPRN_XER; /* save XER in stackframe */ \
|
|
|
std r10,SOFTE(r1); \
|
|
@@ -332,8 +340,7 @@ do_kvm_##n: \
|
|
|
li r10,0; \
|
|
|
ld r11,exception_marker@toc(r2); \
|
|
|
std r10,RESULT(r1); /* clear regs->result */ \
|
|
|
- std r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ \
|
|
|
- ACCOUNT_STOLEN_TIME
|
|
|
+ std r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */
|
|
|
|
|
|
/*
|
|
|
* Exception vectors.
|