# HG changeset patch # User Isaku Yamahata # Date 1210731778 -32400 # Node ID c7e929cfb87aa4c505eecae2746d61e1226d8a90 # Parent ececa5a5473be16d416cfb675d3a6bf338d7db4c fix EFI_SAL_SET_VECTORS While booting recent Linux kernel under VTi domain with the latest open gfw, it panics as following. Linux kernel calls sal call of (EFI_SAL_SET_VECTORS, EFI_SAL_SET_INIT_VECTOR) and the gfw accesses the invalid address. The uncached physical addresses are hard coded, but they aren't relocated when switching to virtual address mode. And calling xen sal hypercall looks copy and past typo. Unable to handle kernel paging request at virtual address 80000000ffffff80 swapper[0]: Oops 8804682956800 [1] Modules linked in: Pid: 0, CPU 0, comm: swapper psr : 00001010084a2010 ifs : 8000000000001634 ip : [] Not tainted (2.6.26-rc1xen-ia64-08245-g59409b5-dirt(XEN) paddr_to_maddr: called with bad memory address: 0x7000000004138100 - iip=a0000001000660c0 ip is at 0xe00000000f1479e0 unat: 0000000000000000 pfs : 000000000000091a rsc : 0000000000000003 rnat: 0000000000000005 bsps: 0000000000000000 pr : 000000000002aa49 ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c8a70433f csd : 0000000000000000 ssd : 0000000000000000 b0 : a00000010075e3f0 b6 : a000000100052100 b7 : e00000000f147620 f6 : 000000000000000000000 f7 : 000000000000000000000 f8 : 000000000000000000000 f9 : 000000000000000000000 f10 : 000000000000000000000 f11 : 000000000000000000000 r1 : e00000000f152020 r2 : 0000000000000001 r3 : 000000000000040d r8 : 0000000000000000 r9 : 000000000000040c r10 : a000000100052100 r11 : a000000100958708 r12 : a000000100943bd0 r13 : a00000010093c000 r14 : 80000000ffffff80 r15 : e00000000f152130 r16 : e00000000f152138 r17 : a000000100731948 r18 : a000000100052100 r19 : a0000001009b23b8 r20 : a0000001009ed548 r21 : 00000000dead4ead r22 : a000000100958704 r23 : 0000000000000000 r24 : a000000100a07518 r25 : e00000000f147620 r26 : a0000001009ee038 r27 : a000000100731948 r28 : a000000100052100 r29 : a000000100731948 r30 : a000000100052100 r31 : 0000000000000000 Signed-off-by: Isaku Yamahata diff --git a/edk2-sparse/EdkXenPkg/Dxe/XenSal/Sal.c b/edk2-sparse/EdkXenPkg/Dxe/XenSal/Sal.c --- a/edk2-sparse/EdkXenPkg/Dxe/XenSal/Sal.c +++ b/edk2-sparse/EdkXenPkg/Dxe/XenSal/Sal.c @@ -8,8 +8,8 @@ UINT64 Gp; } SalRendezVector; -struct Fptr *SalMonarchInitVector = (struct Fptr *)0x80000000ffffff80; -struct Fptr *SalSlaveInitVector = (struct Fptr *)0x80000000ffffff90 ; +struct Fptr *SalMonarchInitVector = (struct Fptr *)0xffffff80; +struct Fptr *SalSlaveInitVector = (struct Fptr *)0xffffff90 ; STATIC EFI_SAL_STATUS @@ -122,7 +122,7 @@ SalSlaveInitVector->Gp = Arg7; status = EFI_SAL_SUCCESS; - return SalEmulator (FunctionId, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8); + break; case EFI_SAL_SET_BOOT_RENDEZ_VECTOR: SalRendezVector.Ip = Arg3; SalRendezVector.Gp = Arg4; @@ -136,3 +136,23 @@ } return (SAL_RETURN_REGS) {status, r9, r10, r11}; } + +VOID +EFIAPI +SalProcAddressChangeEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + EfiConvertPointer (0x0, (VOID **) &SalMonarchInitVector); + EfiConvertPointer (0x0, (VOID **) &SalSlaveInitVector); +}