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

--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to