powerpc: Move branch instruction from ACCOUNT_CPU_USER_ENTRY to caller
[PATCH 1/6] powerpc: Move branch instruction from ACCOUNT_CPU_USER_ENTRY to caller The first instruction in ACCOUNT_CPU_USER_ENTRY is 'beq' which checks for exceptions coming from kernel mode. PPR value will be saved immediately after ACCOUNT_CPU_USER_ENTRY and is also for user level exceptions. So moved this branch instruction in the caller code. Signed-off-by: Haren Myneni <haren@us.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
15fab56eca
commit
5d75b26443
4 changed files with 6 additions and 5 deletions
|
@ -224,8 +224,9 @@ do_kvm_##n: \
|
||||||
std r10,0(r1); /* make stack chain pointer */ \
|
std r10,0(r1); /* make stack chain pointer */ \
|
||||||
std r0,GPR0(r1); /* save r0 in stackframe */ \
|
std r0,GPR0(r1); /* save r0 in stackframe */ \
|
||||||
std r10,GPR1(r1); /* save r1 in stackframe */ \
|
std r10,GPR1(r1); /* save r1 in stackframe */ \
|
||||||
|
beq 4f; /* if from kernel mode */ \
|
||||||
ACCOUNT_CPU_USER_ENTRY(r9, r10); \
|
ACCOUNT_CPU_USER_ENTRY(r9, r10); \
|
||||||
std r2,GPR2(r1); /* save r2 in stackframe */ \
|
4: std r2,GPR2(r1); /* save r2 in stackframe */ \
|
||||||
SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
|
SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \
|
||||||
SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
|
SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \
|
||||||
ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \
|
ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#define ACCOUNT_STOLEN_TIME
|
#define ACCOUNT_STOLEN_TIME
|
||||||
#else
|
#else
|
||||||
#define ACCOUNT_CPU_USER_ENTRY(ra, rb) \
|
#define ACCOUNT_CPU_USER_ENTRY(ra, rb) \
|
||||||
beq 2f; /* if from kernel mode */ \
|
|
||||||
MFTB(ra); /* get timebase */ \
|
MFTB(ra); /* get timebase */ \
|
||||||
ld rb,PACA_STARTTIME_USER(r13); \
|
ld rb,PACA_STARTTIME_USER(r13); \
|
||||||
std ra,PACA_STARTTIME(r13); \
|
std ra,PACA_STARTTIME(r13); \
|
||||||
|
@ -38,7 +37,6 @@
|
||||||
ld ra,PACA_USER_TIME(r13); \
|
ld ra,PACA_USER_TIME(r13); \
|
||||||
add ra,ra,rb; /* add on to user time */ \
|
add ra,ra,rb; /* add on to user time */ \
|
||||||
std ra,PACA_USER_TIME(r13); \
|
std ra,PACA_USER_TIME(r13); \
|
||||||
2:
|
|
||||||
|
|
||||||
#define ACCOUNT_CPU_USER_EXIT(ra, rb) \
|
#define ACCOUNT_CPU_USER_EXIT(ra, rb) \
|
||||||
MFTB(ra); /* get timebase */ \
|
MFTB(ra); /* get timebase */ \
|
||||||
|
|
|
@ -62,8 +62,9 @@ system_call_common:
|
||||||
std r12,_MSR(r1)
|
std r12,_MSR(r1)
|
||||||
std r0,GPR0(r1)
|
std r0,GPR0(r1)
|
||||||
std r10,GPR1(r1)
|
std r10,GPR1(r1)
|
||||||
|
beq 2f /* if from kernel mode */
|
||||||
ACCOUNT_CPU_USER_ENTRY(r10, r11)
|
ACCOUNT_CPU_USER_ENTRY(r10, r11)
|
||||||
std r2,GPR2(r1)
|
2: std r2,GPR2(r1)
|
||||||
std r3,GPR3(r1)
|
std r3,GPR3(r1)
|
||||||
mfcr r2
|
mfcr r2
|
||||||
std r4,GPR4(r1)
|
std r4,GPR4(r1)
|
||||||
|
|
|
@ -159,8 +159,9 @@ exc_##n##_common: \
|
||||||
std r9,GPR9(r1); /* save r9 in stackframe */ \
|
std r9,GPR9(r1); /* save r9 in stackframe */ \
|
||||||
std r10,_NIP(r1); /* save SRR0 to stackframe */ \
|
std r10,_NIP(r1); /* save SRR0 to stackframe */ \
|
||||||
std r11,_MSR(r1); /* save SRR1 to stackframe */ \
|
std r11,_MSR(r1); /* save SRR1 to stackframe */ \
|
||||||
|
beq 2f; /* if from kernel mode */ \
|
||||||
ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \
|
ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \
|
||||||
ld r3,excf+EX_R10(r13); /* get back r10 */ \
|
2: ld r3,excf+EX_R10(r13); /* get back r10 */ \
|
||||||
ld r4,excf+EX_R11(r13); /* get back r11 */ \
|
ld r4,excf+EX_R11(r13); /* get back r11 */ \
|
||||||
mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \
|
mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \
|
||||||
std r12,GPR12(r1); /* save r12 in stackframe */ \
|
std r12,GPR12(r1); /* save r12 in stackframe */ \
|
||||||
|
|
Loading…
Add table
Reference in a new issue