Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Zou Nan hai and committed by
Tony Luck
f5a3f3dc 5c55cd63

+1 -6
-5
arch/ia64/kernel/mca_asm.S
··· 1025 1025 1026 1026 ia64_set_kernel_registers: 1027 1027 add temp3=MCA_SP_OFFSET, r3 1028 - add temp4=MCA_SOS_OFFSET+SOS(OS_GP), r3 1029 1028 mov b0=r2 // save return address 1030 1029 GET_IA64_MCA_DATA(temp1) 1031 1030 ;; 1032 - add temp4=temp4, temp1 // &struct ia64_sal_os_state.os_gp 1033 1031 add r12=temp1, temp3 // kernel stack pointer on MCA/INIT stack 1034 1032 add r13=temp1, r3 // set current to start of MCA/INIT stack 1035 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 1035 DATA_PA_TO_VA(r12,temp2) 1041 1036 DATA_PA_TO_VA(r13,temp3) 1042 1037 ;;
+1 -1
include/asm-ia64/mca_asm.h
··· 197 197 movl temp2 = start_addr; \ 198 198 ;; \ 199 199 mov cr.iip = temp2; \ 200 + movl gp = __gp \ 200 201 ;; \ 201 202 DATA_PA_TO_VA(sp, temp1); \ 202 - DATA_PA_TO_VA(gp, temp2); \ 203 203 srlz.i; \ 204 204 ;; \ 205 205 nop 1; \