diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-07-24 13:44:08 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-07-24 13:44:08 +0100 |
commit | 090519068631f979b0e913023fe0aa77386053c4 (patch) | |
tree | fa93916d1fef0c0e5f3eee826ee69ab7304a0670 | |
parent | d4a22e75c9fe786833451a684014ec2bd7a6fe1e (diff) | |
download | xen-090519068631f979b0e913023fe0aa77386053c4.tar.gz xen-090519068631f979b0e913023fe0aa77386053c4.tar.bz2 xen-090519068631f979b0e913023fe0aa77386053c4.zip |
rombios: S3 resume data must be in EBDA.
Rombios itself is read-only.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r-- | tools/firmware/rombios/rombios.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c index c3b3828749..97523dacab 100644 --- a/tools/firmware/rombios/rombios.c +++ b/tools/firmware/rombios/rombios.c @@ -738,7 +738,9 @@ typedef struct { // EBDA must be at most 768 bytes; it lives at 0x9fc00, and the boot // device tables are at 0x9ff00 -- 0x9ffff typedef struct { - unsigned char filler1[0x3D]; + unsigned char ebda_size; + unsigned char s3_resume_flag; + unsigned char filler1[0x3B]; // FDPT - Can be splitted in data members if needed unsigned char fdpt0[0x10]; @@ -757,6 +759,7 @@ typedef struct { upcall_t upcall; } ebda_data_t; + #define EBDA_S3_RESUME_FLAG_OFFSET 1 #define EbdaData ((ebda_data_t *) 0) // for access to the int13ext structure @@ -2356,47 +2359,40 @@ void s3_resume() { Bit32u s3_wakeup_vector; - extern Bit16u s3_wakeup_ip; - extern Bit16u s3_wakeup_cs; - extern Bit8u s3_resume_flag; + Bit16u s3_wakeup_ip, s3_wakeup_cs; + Bit8u s3_resume_flag; ASM_START push ds - mov ax, #0xF000 + push ax + mov ax, #EBDA_SEG mov ds, ax + mov al, [EBDA_S3_RESUME_FLAG_OFFSET] + mov .s3_resume.s3_resume_flag[bp], al + mov byte ptr [EBDA_S3_RESUME_FLAG_OFFSET], #0 + pop ax + pop ds ASM_END - if (s3_resume_flag!=CMOS_SHUTDOWN_S3){ - goto s3_out; - } - s3_resume_flag = 0; + if (s3_resume_flag != CMOS_SHUTDOWN_S3) + return; /* get x_firmware_waking_vector */ s3_wakeup_vector = facs_get32(ACPI_FACS_OFFSET+24); if (!s3_wakeup_vector) { /* get firmware_waking_vector */ s3_wakeup_vector = facs_get32(ACPI_FACS_OFFSET+12); - if (!s3_wakeup_vector) { - goto s3_out; - } + if (!s3_wakeup_vector) + return; } - /* setup wakeup vector */ s3_wakeup_ip = s3_wakeup_vector & 0xF; s3_wakeup_cs = s3_wakeup_vector >> 4; ASM_START - jmpf [_s3_wakeup_ip] - -; S3 data -_s3_wakeup_ip: dw 0x0a -_s3_wakeup_cs: dw 0x0 -_s3_resume_flag: db 0 ; set at POST time by CMOS[0xF] shutdown status -ASM_END - -s3_out: -ASM_START - pop ds + push .s3_resume.s3_wakeup_cs[bp] + push .s3_resume.s3_wakeup_ip[bp] + retf ASM_END } @@ -9871,9 +9867,9 @@ post: jnz not_s3_resume ;; set S3 resume flag - mov dx, #0xF000 + mov dx, #EBDA_SEG mov ds, dx - mov [_s3_resume_flag], AL + mov [EBDA_S3_RESUME_FLAG_OFFSET], AL jmp normal_post not_s3_resume: |