diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2009-01-19 12:53:54 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2009-01-19 12:53:54 -0500 |
commit | 590e715d4a986528aa9ca8d3276e368361d1c7c7 (patch) | |
tree | 1d2352a60bf1554b31c45d11cb6fc170f75a4680 /src/resume.c | |
parent | dfc18fc39ad4ce32093b2b0c7b46af94c114c782 (diff) | |
download | seabios-590e715d4a986528aa9ca8d3276e368361d1c7c7.tar.gz |
Fix apparent bug in 16bit resume code.
The BDA offsets were adding in 0x400 twice.
Also, use lss insn instead of manually setting %ss and %sp.
Also, don't force segment value into %eax.
Diffstat (limited to 'src/resume.c')
-rw-r--r-- | src/resume.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/resume.c b/src/resume.c index 86c0555a..f141ea3f 100644 --- a/src/resume.c +++ b/src/resume.c @@ -33,17 +33,16 @@ handle_resume(u8 status) debug_serial_setup(); dprintf(1, "In resume (status=%d)\n", status); - struct bios_data_area_s *bda = MAKE_FARPTR(SEG_BDA, 0); switch (status) { case 0xfe: if (CONFIG_S3_RESUME) { // S3 resume request. Jump to 32bit mode to handle the resume. asm volatile( - "movw %%ax, %%ss\n" + "movw %w1, %%ss\n" "movl %0, %%esp\n" "pushl $_code32_s3_resume\n" "jmp transition32\n" - : : "i"(BUILD_S3RESUME_STACK_ADDR), "a"(0) + : : "i"(BUILD_S3RESUME_STACK_ADDR), "r"(0) ); break; } @@ -62,33 +61,32 @@ handle_resume(u8 status) eoi_pic2(); // NO BREAK case 0x0a: +#define BDA_JUMP_IP (((struct bios_data_area_s *)0)->jump_ip) // resume execution by jump via 40h:0067h asm volatile( - "movw %%ax, %%ds\n" + "movw %w1, %%ds\n" "ljmpw *%0\n" - : : "m"(bda->jump_ip), "a"(SEG_BDA) + : : "m"(BDA_JUMP_IP), "r"(SEG_BDA) ); break; case 0x0b: // resume execution via IRET via 40h:0067h asm volatile( - "movw %%ax, %%ds\n" - "movw %0, %%sp\n" - "movw %1, %%ss\n" + "movw %w1, %%ds\n" + "lssw %0, %%sp\n" "iretw\n" - : : "m"(bda->jump_ip), "m"(bda->jump_cs), "a"(SEG_BDA) + : : "m"(BDA_JUMP_IP), "r"(SEG_BDA) ); break; case 0x0c: // resume execution via RETF via 40h:0067h asm volatile( - "movw %%ax, %%ds\n" - "movw %0, %%sp\n" - "movw %1, %%ss\n" + "movw %w1, %%ds\n" + "lssw %0, %%sp\n" "lretw\n" - : : "m"(bda->jump_ip), "m"(bda->jump_cs), "a"(SEG_BDA) + : : "m"(BDA_JUMP_IP), "r"(SEG_BDA) ); break; } |