On 12/05/13 18:42, Paolo Bonzini wrote:
> diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
> b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
> index e59fd04..d1cac9d 100644
> --- a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
> +++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
> @@ -19,7 +19,7 @@ ASM_PFX(AsmTransferControl):
> # rcx S3WakingVector :DWORD
> # rdx AcpiLowMemoryBase :DWORD
> lea _AsmTransferControl_al_0000(%rip), %eax
> - movq $0x2800000000, %r8
> + movq $0x1000000000, %r8
> orq %r8, %rax
> pushq %rax
> shrd $20, %ecx, %ebx
> @@ -28,24 +28,32 @@ ASM_PFX(AsmTransferControl):
> movl %ebx, jmp_addr(%rip)
> lret
> _AsmTransferControl_al_0000:
> + # Old SS should still be okay?
> + addl _AsmTransferControl_al_0001-_AsmTransferControl_al_0000, %eax
> + pushl $0x28
> + pushl %eax
> + movq %cr0, %rax
> + movq %cr4, %rbx
> + andl $0x7fffffff, %eax
> + andb $0xdf, %bl
> + movq %rax, %cr0 # sets EFER.LMA=0 too, so says Intel
> + movl $0x0c0000080, %ecx
> + rdmsr
> + andb $0xfe, %ah # set EFER.LME=0
> + wrmsr
> + movq %rbx, %cr4 # only now set CR4.PAE=0
> + lret
> +_AsmTransferControl_al_0001:
> .byte 0x0b8, 0x30, 0 # mov ax, 30h as selector
> movl %eax, %ds
> movl %eax, %es
> movl %eax, %fs
> movl %eax, %gs
> movl %eax, %ss
> - movq %cr0, %rax
> - movq %cr4, %rbx
> - .byte 0x66
> - andl $0x7ffffffe, %eax
> - andb $0xdf, %bl
> - movq %rax, %cr0
> - .byte 0x66
> - movl $0x0c0000080, %ecx
> - rdmsr
> - andb $0xfe, %ah
> - wrmsr
> - movq %rbx, %cr4
> + movl %cr0, %rax # Get control register 0
> + .byte 0x66
> + .byte 0x83,0xe0,0xfe # and eax, 0fffffffeh ; Clear PE bit (bit #0)
> + .byte 0xf,0x22,0xc0 # mov cr0, eax ; Activate real mode
I had to add this incremental patch to get it to compile:
diff --git a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
index c28df3f..85d2a36 100644
--- a/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
+++ b/MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/X64/S3Asm.S
@@ -30,8 +30,8 @@ ASM_PFX(AsmTransferControl):
_AsmTransferControl_al_0000:
# Old SS should still be okay?
addl _AsmTransferControl_al_0001-_AsmTransferControl_al_0000, %eax
- pushl $0x28
- pushl %eax
+ .byte 0x6a,0x28 # pushl $0x28 ; opnd sz = 32bits in seg 0x10
+ .byte 0x50 # pushl %eax
movq %cr0, %rax
movq %cr4, %rbx
andl $0x7fffffff, %eax
@@ -50,7 +50,7 @@ _AsmTransferControl_al_0001:
movl %eax, %fs
movl %eax, %gs
movl %eax, %ss
- movl %cr0, %rax # Get control register 0
+ .byte 0x0f,0x20,0xc0 # movl %cr0, %eax ; Get control register 0
.byte 0x66
.byte 0x83,0xe0,0xfe # and eax, 0fffffffeh ; Clear PE bit (bit #0)
.byte 0xf,0x22,0xc0 # mov cr0, eax ; Activate real mode
The 2nd lret is reached (just before _AsmTransferControl_al_0001), but then the
CPU goes off in the woods. For a while it seems to be spinning who knows where,
and in 15-20 seconds or so the guest reboots.
Does gas support mode switches in one file? I found examples on the net (for
nasm I think) where people were thunking to real mode and back to protected
mode in a single assembly file, and they could use native mnemonics for each
part. (They just switched the assembler's mode in sync with execution modes.)
Thanks
Laszlo
Thanks,
Laszlo
------------------------------------------------------------------------------
Sponsored by Intel(R) XDK
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel