diff options
author | Zou Nan hai <nanhai.zou@intel.com> | 2006-09-13 20:25:15 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2006-09-26 17:13:03 -0400 |
commit | f5a3f3dc189485d607fbd42678cc23958acc0a6e (patch) | |
tree | 7896c4c57d99011129af4ebfc8e3c24ca460cd1a | |
parent | 5c55cd63a77a85f603c98c2171a8054ca34b6a9f (diff) |
[IA64] Make gp value point to Region 5 in mca handler
MCA dispatch code take physical address of GP passed from SAL, then call
DATA_PA_TO_VA twice on GP before call into C code. The first time is
in ia64_set_kernel_register, the second time is in VIRTUAL_MODE_ENTER.
The gp is changed to a virtual address in region 7 because DATA_PA_TO_VA
is implemented by dep instruction.
However when notify blocks were called from MCA handler code, because
notify blocks are supported by callback function pointers, gp value
value was switched to region 5 again.
The patch set gp register to kernel gp of region 5 at entry of MCA
dispatch.
Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | arch/ia64/kernel/mca_asm.S | 5 | ||||
-rw-r--r-- | include/asm-ia64/mca_asm.h | 2 |
2 files changed, 1 insertions, 6 deletions
diff --git a/arch/ia64/kernel/mca_asm.S b/arch/ia64/kernel/mca_asm.S index 96047491d1b9..ee3ff76c8a35 100644 --- a/arch/ia64/kernel/mca_asm.S +++ b/arch/ia64/kernel/mca_asm.S | |||
@@ -1025,18 +1025,13 @@ ia64_old_stack: | |||
1025 | 1025 | ||
1026 | ia64_set_kernel_registers: | 1026 | ia64_set_kernel_registers: |
1027 | add temp3=MCA_SP_OFFSET, r3 | 1027 | add temp3=MCA_SP_OFFSET, r3 |
1028 | add temp4=MCA_SOS_OFFSET+SOS(OS_GP), r3 | ||
1029 | mov b0=r2 // save return address | 1028 | mov b0=r2 // save return address |
1030 | GET_IA64_MCA_DATA(temp1) | 1029 | GET_IA64_MCA_DATA(temp1) |
1031 | ;; | 1030 | ;; |
1032 | add temp4=temp4, temp1 // &struct ia64_sal_os_state.os_gp | ||
1033 | add r12=temp1, temp3 // kernel stack pointer on MCA/INIT stack | 1031 | add r12=temp1, temp3 // kernel stack pointer on MCA/INIT stack |
1034 | add r13=temp1, r3 // set current to start of MCA/INIT stack | 1032 | add r13=temp1, r3 // set current to start of MCA/INIT stack |
1035 | add r20=temp1, r3 // physical start of MCA/INIT stack | 1033 | add r20=temp1, r3 // physical start of MCA/INIT stack |
1036 | ;; | 1034 | ;; |
1037 | ld8 r1=[temp4] // OS GP from SAL OS state | ||
1038 | ;; | ||
1039 | DATA_PA_TO_VA(r1,temp1) | ||
1040 | DATA_PA_TO_VA(r12,temp2) | 1035 | DATA_PA_TO_VA(r12,temp2) |
1041 | DATA_PA_TO_VA(r13,temp3) | 1036 | DATA_PA_TO_VA(r13,temp3) |
1042 | ;; | 1037 | ;; |
diff --git a/include/asm-ia64/mca_asm.h b/include/asm-ia64/mca_asm.h index 27c9203d8ce3..76203f9a8718 100644 --- a/include/asm-ia64/mca_asm.h +++ b/include/asm-ia64/mca_asm.h | |||
@@ -197,9 +197,9 @@ | |||
197 | movl temp2 = start_addr; \ | 197 | movl temp2 = start_addr; \ |
198 | ;; \ | 198 | ;; \ |
199 | mov cr.iip = temp2; \ | 199 | mov cr.iip = temp2; \ |
200 | movl gp = __gp \ | ||
200 | ;; \ | 201 | ;; \ |
201 | DATA_PA_TO_VA(sp, temp1); \ | 202 | DATA_PA_TO_VA(sp, temp1); \ |
202 | DATA_PA_TO_VA(gp, temp2); \ | ||
203 | srlz.i; \ | 203 | srlz.i; \ |
204 | ;; \ | 204 | ;; \ |
205 | nop 1; \ | 205 | nop 1; \ |