|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] rombios interface for HVM S3
Keir Fraser wrote: > On 2/6/08 14:45, "Juergen Keil" <jk@xxxxxxxx> wrote: > > > For unknown reasons, HVM S3 resume hangs in the bios when trying to load > > the x_firmware_waking_vector from absolute address 0xEA01C (it hangs for > > access to address 0x10000, but doesn't hang for 0xfffe). > > It works on Intel because there we emulate the rombios, and our emulator > does not bother with segment limit checks in real mode. This is actually > more lenient than real hardware, hence an AMD CPU (which is directly > executing the rombios code) will fault on the access because it is at a > segment offset greater than 64kB. > > Your patch is good. Please re-submit with a fixed changeset comment and a > signed-off-by line. I'll then check it in. Ok, comment is updated, see the attachment. HVM S3 resume hangs in bios on AMD cpus; support 20-bit firmware_waking_vector
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 now uses 20-bits (instead of 16) from the FACS
standard firmware_waking_vector.
Signed-off-by: Juergen keil <jk@xxxxxxxx>
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c
+++ b/tools/firmware/rombios/rombios.c
@@ -2311,10 +2311,31 @@
#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 @@
}
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 @@
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
_______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |