UefiCpuPkg/CpuMpPei/X64: Use CodeSegment and DataSegment fields

Using CodeSegment and DataSegment fields in ExchangeInfo instead of the hardcode
MACROs for x64 arch. Switch AP from real mode to long mode directly, so needn't
the CS/DS of protected mode.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Giri Mudusuru <giri.p.mudusuru@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
This commit is contained in:
Jeff Fan 2016-07-11 19:40:05 +08:00
parent 249ed12ea0
commit d1471c0112
2 changed files with 70 additions and 92 deletions

View File

@ -1,5 +1,5 @@
;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ ;
; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> ; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
; This program and the accompanying materials ; This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License ; are licensed and made available under the terms and conditions of the BSD License
; which accompanies this distribution. The full text of the license may be found at ; which accompanies this distribution. The full text of the license may be found at
@ -35,37 +35,30 @@ RendezvousFunnelProcStart::
; Save BIST information to ebp firstly ; Save BIST information to ebp firstly
db 66h, 08bh, 0e8h ; mov ebp, eax ; save BIST information db 66h, 08bh, 0e8h ; mov ebp, eax ; save BIST information
db 8ch,0c8h ; mov ax,cs db 8ch,0c8h ; mov ax, cs
db 8eh,0d8h ; mov ds,ax db 8eh,0d8h ; mov ds, ax
db 8eh,0c0h ; mov es,ax db 8eh,0c0h ; mov es, ax
db 8eh,0d0h ; mov ss,ax db 8eh,0d0h ; mov ss, ax
db 33h,0c0h ; xor ax,ax db 33h,0c0h ; xor ax, ax
db 8eh,0e0h ; mov fs,ax db 8eh,0e0h ; mov fs, ax
db 8eh,0e8h ; mov gs,ax db 8eh,0e8h ; mov gs, ax
db 0BEh ; opcode of mov si, mem16 db 0BEh ; opcode of mov si, mem16
dw BufferStartLocation ; mov si, BufferStartLocation dw BufferStartLocation ; mov si, BufferStartLocation
db 66h, 8Bh, 1Ch ; mov ebx,dword ptr [si] db 66h, 8Bh, 1Ch ; mov ebx, dword ptr [si]
db 0BFh ; opcode of mov di, mem16 db 0BFh ; opcode of mov di, mem16
dw PmodeOffsetLocation ; mov di, PmodeOffsetLocation dw LmodeOffsetLocation ; mov di, LmodeOffsetLocation
db 66h, 8Bh, 05h ; mov eax,dword ptr [di] db 66h, 8Bh, 05h ; mov eax, [di]
db 8Bh, 0F8h ; mov di, ax
db 83h, 0EFh,06h ; sub di, 06h
db 66h, 03h, 0C3h ; add eax, ebx
db 66h, 89h, 05h ; mov dword ptr [di],eax
db 0BFh ; opcode of mov di, mem16 db 0BFh ; opcode of mov di, mem16
dw LmodeOffsetLocation ; mov di, LmodeOffsetLocation dw CodeSegmentLocation ; mov di, CodeSegmentLocation
db 66h, 8Bh, 05h ; mov eax,dword ptr [di] db 66h, 8Bh, 15h ; mov edx, [di]
db 8Bh, 0F8h ; mov di, ax db 89h, 0C7h ; mov di, ax
db 83h, 0EFh,06h ; sub di, 06h db 83h, 0EFh, 02h ; sub di, 02h
db 66h, 03h, 0C3h ; add eax, ebx db 89h, 15h ; mov [di], dx ; Patch long mode CS
db 66h, 89h, 05h ; mov dword ptr [di],eax db 83h, 0EFh, 04h ; sub di, 04h
db 66h, 01h, 0D8h ; add eax, ebx
db 0BEh db 66h, 89h, 05h ; mov [di], eax ; Patch address
dw Cr3Location ; mov si, Cr3Location
db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3
db 0BEh ; opcode of mov si, mem16 db 0BEh ; opcode of mov si, mem16
dw GdtrLocation ; mov si, GdtrLocation dw GdtrLocation ; mov si, GdtrLocation
@ -77,48 +70,44 @@ RendezvousFunnelProcStart::
db 66h ; db 66h db 66h ; db 66h
db 2Eh,0Fh, 01h, 1Ch ; lidt fword ptr cs:[si] db 2Eh,0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
db 33h, 0C0h ; xor ax, ax db 0BFh ; opcode of mov di, mem16
db 8Eh, 0D8h ; mov ds, ax dw DataSegmentLocation ; mov di, DataSegmentLocation
db 66h, 8Bh, 3Dh ; mov edi, [di] ; Save long mode DS in edi
db 0Fh, 20h, 0C0h ; mov eax, cr0 ;Get control register 0 db 0BEh
db 66h, 83h, 0C8h, 03h ; or eax, 000000003h ;Set PE bit (bit #0) & MP dw Cr3Location ; mov si, Cr3Location
db 0Fh, 22h, 0C0h ; mov cr0, eax db 66h, 8Bh, 0Ch ; mov ecx, dword ptr [si] ; ECX is keeping the value of CR3
db 66h, 67h, 0EAh ; far jump db 31h, 0C0h ; xor ax, ax
dd 0h ; 32-bit offset db 8Eh, 0D8h ; mov ds, ax ; Clear data segment
dw PROTECT_MODE_CS ; 16-bit selector
Flat32Start:: ; protected mode entry point db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
mov ax, PROTECT_MODE_DS db 66h, 83h, 0C8h, 03h ; or eax, 000000003h ; Set PE bit (bit #0) & MP
mov ds, ax db 0Fh, 22h, 0C0h ; mov cr0, eax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
db 0Fh, 20h, 0E0h ; mov eax, cr4 db 0Fh, 20h, 0E0h ; mov eax, cr4
db 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5 db 66h, 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5
db 0Fh, 22h, 0E0h ; mov cr4, eax db 0Fh, 22h, 0E0h ; mov cr4, eax
db 0Fh, 22h, 0D9h ; mov cr3, ecx db 0Fh, 22h, 0D9h ; mov cr3, ecx
db 0B9h db 66h, 0B9h
dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number. dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number.
db 0Fh, 32h ; rdmsr ; Read EFER. db 0Fh, 32h ; rdmsr ; Read EFER.
db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1. db 66h, 0Fh, 0BAh, 0E8h, 08h; bts eax, 8 ; Set LME=1.
db 0Fh, 30h ; wrmsr ; Write EFER. db 0Fh, 30h ; wrmsr ; Write EFER.
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0. db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0.
db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1. db 66h, 0Fh, 0BAh, 0E8h, 1Fh; bts eax, 31 ; Set PG=1.
db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0. db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0.
LONG_JUMP: LONG_JUMP:
db 67h, 0EAh ; far jump db 66h, 0EAh ; far jump
dd 0h ; 32-bit offset dd 0h ; 32-bit offset
dw LONG_MODE_CS ; 16-bit selector dw 0h ; 16-bit selector
LongModeStart:: LongModeStart::
mov ax, LONG_MODE_DS mov eax, edi
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov ss, ax mov ss, ax
@ -187,7 +176,7 @@ RendezvousFunnelProcEnd::
AsmGetAddressMap PROC AsmGetAddressMap PROC
mov rax, offset RendezvousFunnelProcStart mov rax, offset RendezvousFunnelProcStart
mov qword ptr [rcx], rax mov qword ptr [rcx], rax
mov qword ptr [rcx + 8h], Flat32Start - RendezvousFunnelProcStart mov qword ptr [rcx + 8h], 0
mov qword ptr [rcx + 10h], LongModeStart - RendezvousFunnelProcStart mov qword ptr [rcx + 10h], LongModeStart - RendezvousFunnelProcStart
mov qword ptr [rcx + 18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart mov qword ptr [rcx + 18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
ret ret

View File

@ -52,23 +52,16 @@ BITS 16
mov si, BufferStartLocation mov si, BufferStartLocation
mov ebx, [si] mov ebx, [si]
mov di, PmodeOffsetLocation mov di, LmodeOffsetLocation
mov eax, [di] mov eax, [di]
mov di, CodeSegmentLocation
mov edx, [di]
mov di, ax mov di, ax
sub di, 06h sub di, 02h
mov [di],dx ; Patch long mode CS
sub di, 04h
add eax, ebx add eax, ebx
mov [di],eax mov [di],eax ; Patch address
mov di, LmodeOffsetLocation
mov eax, [di]
mov di, ax
sub di, 06h
add eax, ebx
mov [di],eax
mov si, Cr3Location
mov ecx,[si] ; ECX is keeping the value of CR3
mov si, GdtrLocation mov si, GdtrLocation
o32 lgdt [cs:si] o32 lgdt [cs:si]
@ -77,43 +70,38 @@ o32 lgdt [cs:si]
o32 lidt [cs:si] o32 lidt [cs:si]
mov di, DataSegmentLocation
mov edi, [di] ; Save long mode DS in edi
mov si, Cr3Location ; Save CR3 in ecx
mov ecx, [si]
xor ax, ax xor ax, ax
mov ds, ax mov ds, ax ; Clear data segment
mov eax, cr0 ;Get control register 0 mov eax, cr0 ; Get control register 0
or eax, 000000003h ;Set PE bit (bit #0) & MP or eax, 000000003h ; Set PE bit (bit #0) & MP
mov cr0, eax mov cr0, eax
jmp PROTECT_MODE_CS:strict dword 0 ; far jump to protected mode
BITS 32
Flat32Start: ; protected mode entry point
mov ax, PROTECT_MODE_DS
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov eax, cr4 mov eax, cr4
bts eax, 5 bts eax, 5
mov cr4, eax mov cr4, eax
mov cr3, ecx mov cr3, ecx ; Load CR3
mov ecx, 0c0000080h ; EFER MSR number
rdmsr ; Read EFER
bts eax, 8 ; Set LME=1
wrmsr ; Write EFER
mov ecx, 0c0000080h ; EFER MSR number. mov eax, cr0 ; Read CR0
rdmsr ; Read EFER. bts eax, 31 ; Set PG=1
bts eax, 8 ; Set LME=1. mov cr0, eax ; Write CR0
wrmsr ; Write EFER.
mov eax, cr0 ; Read CR0. jmp 0:strict dword 0 ; far jump to long mode
bts eax, 31 ; Set PG=1.
mov cr0, eax ; Write CR0.
jmp LONG_MODE_CS:strict dword 0 ; far jump to long mode
BITS 64 BITS 64
LongModeStart: LongModeStart:
mov ax, LONG_MODE_DS mov eax, edi
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov ss, ax mov ss, ax
@ -171,6 +159,7 @@ CProcedureInvoke:
sub rsp, 20h sub rsp, 20h
call rax ; invoke C function call rax ; invoke C function
add rsp, 20h add rsp, 20h
jmp $
RendezvousFunnelProcEnd: RendezvousFunnelProcEnd:
@ -181,7 +170,7 @@ global ASM_PFX(AsmGetAddressMap)
ASM_PFX(AsmGetAddressMap): ASM_PFX(AsmGetAddressMap):
mov rax, ASM_PFX(RendezvousFunnelProc) mov rax, ASM_PFX(RendezvousFunnelProc)
mov qword [rcx], rax mov qword [rcx], rax
mov qword [rcx + 8h], Flat32Start - RendezvousFunnelProcStart mov qword [rcx + 8h], 0
mov qword [rcx + 10h], LongModeStart - RendezvousFunnelProcStart mov qword [rcx + 10h], LongModeStart - RendezvousFunnelProcStart
mov qword [rcx + 18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart mov qword [rcx + 18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
ret ret