From: Keir Fraser Date: Mon, 2 Jun 2008 15:05:07 +0000 (+0100) Subject: rombios: S3 resume fixes. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14200^2~106 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=9efd150651fe690e2bc4e5675209c75adedd823c;p=xen.git rombios: S3 resume fixes. On AMD cpus, HVM S3 resume was hanging in the bios when trying to load the x_firmware_waking_vector from absolute address 0xEA01C (that is, a segment offset greater than 64kB). This change also now uses 20-bits (instead of 16) from the FACS standard firmware_waking_vector. Signed-off-by: Juergen Keil --- diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c index 23558e8f45..79a328f4a7 100644 --- a/tools/firmware/rombios/rombios.c +++ b/tools/firmware/rombios/rombios.c @@ -2311,10 +2311,31 @@ debugger_off() #define ACPI_FACS_OFFSET 0x10 /* S3 resume status in CMOS 0Fh shutdown status byte*/ +Bit32u facs_get32(offs) +Bit16u offs; +{ +ASM_START + push bp + mov bp, sp + + push ds + mov ax, #(ACPI_FACS_ADDRESS >> 4) + mov ds, ax + + mov bx, 4[bp] + mov ax, [bx] + mov dx, 2[bx] + pop ds + + pop bp +ASM_END +} + + void s3_resume() { - Bit16u s3_wakeup_vector; + Bit32u s3_wakeup_vector; extern Bit16u s3_wakeup_ip; extern Bit16u s3_wakeup_cs; extern Bit8u s3_resume_flag; @@ -2330,19 +2351,14 @@ ASM_END } s3_resume_flag = 0; -ASM_START - mov ax, #0x0 - mov ds, ax -ASM_END - /* get x_firmware_waking_vector */ - s3_wakeup_vector = *((Bit16u*)(ACPI_FACS_ADDRESS+ACPI_FACS_OFFSET+24)); - if (s3_wakeup_vector == 0){ + s3_wakeup_vector = facs_get32(ACPI_FACS_OFFSET+24); + if (!s3_wakeup_vector) { /* get firmware_waking_vector */ - s3_wakeup_vector = *((Bit16u*)(ACPI_FACS_ADDRESS+ACPI_FACS_OFFSET+12)); - if (s3_wakeup_vector == 0){ + s3_wakeup_vector = facs_get32(ACPI_FACS_OFFSET+12); + if (!s3_wakeup_vector) { goto s3_out; - } + } } /* setup wakeup vector */ @@ -2350,13 +2366,6 @@ ASM_END s3_wakeup_cs = s3_wakeup_vector >> 4; ASM_START - mov bx, [_s3_wakeup_cs] - mov dx, [_s3_wakeup_ip] - - mov ax, #0xF000 - mov ds, ax - mov [_s3_wakeup_cs], bx - mov [_s3_wakeup_ip], dx jmpf [_s3_wakeup_ip] ; S3 data