mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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 <jk@tools.de>
This commit is contained in:
1 parent
e00ed2adcd
commit
9efd150651
1 file changed
+27
-18
@@ -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
|
||||
|
||||