[coreboot] question about switching from real mode to protected mode in smm handler

Fengwei Zhang namedylan at gmail.com
Wed Nov 17 04:41:31 CET 2010


Hi all,

I am implementing SMM on K8/vt8237r, and I have problem with switching 
from real mode to protected mode in smm handler.

I followed the smmhandler.S code in /src/cpu/x86/smm/ directory
If I put my rsm instruction before ljmp instruction, I could invoke SMI 
successfully.
	/* Enable protected mode */
	data32  ljmp    $0x08, $1f

but if I put rsm instruction below that(even commented out the C 
procedure), my machine will freeze after the invoking.

The only difference between my code and ICH4 implementation is:
I didn't copy the smm bin file(include smmhandler.S smihandler.c 
smm.ld), to location 0xa0000, I just copied the smmhandler.S file to 
location 0xa0000 and wrote a jmp statement at 0xa8000.

In order to make it simple, I commented out the C procedure, and only 
assembly in smmhandler.


I may didn't set global descriptor table correctly.
I understand ljmp $0x08, $1f is going to use first entry of gdt, and 
traslate the logical address to linear address.
smmhandler.S code has setted up correct smm_gdt, and I also copied the 
code to location 0xa0000 (since it is in smmhander.S file).

.code16
.align	4, 0xff
smm_gdtptr16:
	.word	smm_gdt_end - smm_gdt - 1
	.long	smm_gdt - smm_handler_start + 0xa0000 + SMM_HANDLER_OFFSET
.code32
smm_gdt:
	/* The first GDT entry can not be used. Keep it zero */
	.long	0x00000000, 0x00000000
	/* gdt selector 0x08, flat code segment */
	.word	0xffff, 0x0000
	.byte	0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, 4GB limit */
	/* gdt selector 0x10, flat data segment */
	.word	0xffff, 0x0000
	.byte	0x00, 0x93, 0xcf, 0x00
smm_gdt_end:


I would appreciate it if someone could help me out.

Best,
Fengwei




More information about the coreboot mailing list