* [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS
@ 2008-11-16 9:33 Gleb Natapov
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
` (5 more replies)
0 siblings, 6 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:33 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
Hello,
This patch series adds S3 (suspend to RAM) ACPI state to BIOS. Most
changes concern themselves with preventing BIOS from using memory
locations available to a guest OS.
Changelog:
v2:
- Don't disable SMM.
- Jump to resume vector ASAP. Don't execute entire POST.
- Use smp_cpus directly for smp initialization instead of special memory
location.
v3:
- Stack pointer for rombios32 code depends on EBDA settings
- Fix .data and .rodata* section overlap
- Various small fixes
v4:
- If resume vector is NULL return to normal POST
---
Gleb Natapov (5):
Don't power down vga card on entering S3 state.
Don't use unreserved memory in BIOS.
Execute rombios32 code from rom address 0xe0000.
Preserve memory content during SMM init.
Add S3 state to DSDT. Handle resume event in the BIOS.
bios/Makefile.in | 1
bios/acpi-dsdt.dsl | 45 +++++-
bios/acpi-dsdt.hex | 376 +++++++++++++++++++++++++------------------------
bios/rombios.c | 77 ++++++++--
bios/rombios.h | 1
bios/rombios32.c | 100 +++++++++++--
bios/rombios32.ld | 10 +
bios/rombios32start.S | 11 +
8 files changed, 389 insertions(+), 232 deletions(-)
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS.
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
@ 2008-11-16 9:33 ` Gleb Natapov
2008-11-16 10:50 ` Blue Swirl
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 2/5] Preserve memory content during SMM init Gleb Natapov
` (4 subsequent siblings)
5 siblings, 1 reply; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:33 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
bios/acpi-dsdt.dsl | 30 ++++++++++++++++----
bios/acpi-dsdt.hex | 17 +++++++----
bios/rombios.c | 51 ++++++++++++++++++++++++++++++++++
bios/rombios32.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++---
4 files changed, 159 insertions(+), 18 deletions(-)
diff --git a/bios/acpi-dsdt.dsl b/bios/acpi-dsdt.dsl
index 19ac2f9..280a05e 100644
--- a/bios/acpi-dsdt.dsl
+++ b/bios/acpi-dsdt.dsl
@@ -531,11 +531,29 @@ DefinitionBlock (
}
}
- /* S5 = power off state */
- Name (_S5, Package (4) {
- 0x00, // PM1a_CNT.SLP_TYP
- 0x00, // PM2a_CNT.SLP_TYP
- 0x00, // reserved
- 0x00, // reserved
+ /*
+ * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off) type codes:
+ * must match piix4 emulation.
+ */
+ Name (\_S3, Package (0x04)
+ {
+ 0x01, /* PM1a_CNT.SLP_TYP */
+ 0x01, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
+ })
+ Name (\_S4, Package (0x04)
+ {
+ Zero, /* PM1a_CNT.SLP_TYP */
+ Zero, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
+ })
+ Name (\_S5, Package (0x04)
+ {
+ Zero, /* PM1a_CNT.SLP_TYP */
+ Zero, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
})
}
diff --git a/bios/acpi-dsdt.hex b/bios/acpi-dsdt.hex
index 6bc6268..6088b18 100644
--- a/bios/acpi-dsdt.hex
+++ b/bios/acpi-dsdt.hex
@@ -1,22 +1,22 @@
/*
*
* Intel ACPI Component Architecture
- * ASL Optimizing Compiler version 20060912 [Nov 25 2006]
+ * ASL Optimizing Compiler version 20061109 [May 15 2007]
* Copyright (C) 2000 - 2006 Intel Corporation
* Supports ACPI Specification Revision 3.0a
*
- * Compilation of "acpi-dsdt.dsl" - Sun Sep 14 10:27:40 2008
+ * Compilation of "acpi-dsdt.dsl" - Mon Oct 27 10:37:05 2008
*
* C source code output
*
*/
-unsigned char AmlCode[] =
+const unsigned char AmlCode[] =
{
- 0x44,0x53,0x44,0x54,0xC9,0x07,0x00,0x00, /* 00000000 "DSDT...." */
- 0x01,0x0E,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 "..BXPC.." */
+ 0x44,0x53,0x44,0x54,0xE1,0x07,0x00,0x00, /* 00000000 "DSDT...." */
+ 0x01,0x24,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 ".$BXPC.." */
0x42,0x58,0x44,0x53,0x44,0x54,0x00,0x00, /* 00000010 "BXDSDT.." */
0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
- 0x12,0x09,0x06,0x20,0x10,0x1C,0x5C,0x00, /* 00000020 "... ..\." */
+ 0x09,0x11,0x06,0x20,0x10,0x1C,0x5C,0x00, /* 00000020 "... ..\." */
0x5B,0x80,0x44,0x42,0x47,0x5F,0x01,0x0B, /* 00000028 "[.DBG_.." */
0x44,0xB0,0x0A,0x04,0x5B,0x81,0x0B,0x44, /* 00000030 "D...[..D" */
0x42,0x47,0x5F,0x03,0x44,0x42,0x47,0x4C, /* 00000038 "BG_.DBGL" */
@@ -260,6 +260,9 @@ unsigned char AmlCode[] =
0x8B,0x68,0x01,0x54,0x4D,0x50,0x5F,0x82, /* 000007A8 ".h.TMP_." */
0x54,0x4D,0x50,0x5F,0x60,0x76,0x60,0x70, /* 000007B0 "TMP_`v`p" */
0x60,0x50,0x52,0x51,0x33,0x08,0x5F,0x53, /* 000007B8 "`PRQ3._S" */
- 0x35,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007C0 "5_......" */
+ 0x33,0x5F,0x12,0x06,0x04,0x01,0x01,0x00, /* 000007C0 "3_......" */
+ 0x00,0x08,0x5F,0x53,0x34,0x5F,0x12,0x06, /* 000007C8 ".._S4_.." */
+ 0x04,0x00,0x00,0x00,0x00,0x08,0x5F,0x53, /* 000007D0 "......_S" */
+ 0x35,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007D8 "5_......" */
0x00,
};
diff --git a/bios/rombios.c b/bios/rombios.c
index 9255b89..a34c6b2 100644
--- a/bios/rombios.c
+++ b/bios/rombios.c
@@ -1917,6 +1917,11 @@ shutdown_status_panic(status)
BX_PANIC("Unimplemented shutdown status: %02x\n",(Bit8u)status);
}
+void s3_resume_panic()
+{
+ BX_PANIC("Returned from s3_resume.\n");
+}
+
//--------------------------------------------------------------------------
// print_bios_banner
// displays a the bios version
@@ -2198,6 +2203,33 @@ debugger_off()
outb(0xfedc, 0x00);
}
+int
+s3_resume()
+{
+ Bit32u s3_wakeup_vector;
+ Bit8u s3_resume_flag;
+
+ s3_resume_flag = read_byte(0x40, 0xb0);
+ s3_wakeup_vector = read_dword(0x40, 0xb2);
+
+ BX_INFO("S3 resume called %x 0x%lx\n", s3_resume_flag, s3_wakeup_vector);
+ if (s3_resume_flag != 0xFE || !s3_wakeup_vector)
+ return 0;
+
+ write_byte(0x40, 0xb0, 0);
+
+ /* setup wakeup vector */
+ write_word(0x40, 0xb6, (s3_wakeup_vector & 0xF)); /* IP */
+ write_word(0x40, 0xb8, (s3_wakeup_vector >> 4)); /* CS */
+
+ BX_INFO("S3 resume jump to %x:%x\n", (s3_wakeup_vector >> 4),
+ (s3_wakeup_vector & 0xF));
+ASM_START
+ jmpf [0x04b6]
+ASM_END
+ return 1;
+}
+
#if BX_USE_ATADRV
// ---------------------------------------------------------------------------
@@ -9081,6 +9113,15 @@ retf_post_0x467:
mov ss, [0x469]
retf
+s3_post:
+#if BX_ROMBIOS32
+ call rombios32_init
+#endif
+ call _s3_resume
+ mov bl, #0x00
+ and ax, ax
+ jz normal_post
+ call _s3_resume_panic
;--------------------
eoi_both_pics:
@@ -10005,6 +10046,10 @@ rombios32_05:
;; init the stack pointer
mov esp, #0x00080000
+ ;; pass pointer to s3_resume_flag and s3_resume_vector to rombios32
+ push #0x04b0
+ push #0x04b2
+
;; call rombios32 code
mov eax, #0x00040000
call eax
@@ -10375,6 +10420,12 @@ normal_post:
mov ds, ax
mov ss, ax
+ ;; Save shutdown status
+ mov 0x04b0, bl
+
+ cmp bl, #0xfe
+ jz s3_post
+
;; zero out BIOS data area (40:00..40:ff)
mov es, ax
mov cx, #0x0080 ;; 128 words
diff --git a/bios/rombios32.c b/bios/rombios32.c
index 38cfe06..7b354a8 100644
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -180,6 +180,20 @@ void *memmove(void *d1, const void *s1, size_t len)
return d1;
}
+int memcmp(const void *s1, const void *s2, size_t len)
+{
+ const int8_t *p1 = s1;
+ const int8_t *p2 = s2;
+
+ while (len--) {
+ int r = *p1++ - *p2++;
+ if(r)
+ return r;
+ }
+
+ return 0;
+}
+
size_t strlen(const char *s)
{
const char *s1;
@@ -625,7 +639,7 @@ static int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
return (irq_num + slot_addend) & 3;
}
-static int find_bios_table_area(void)
+static void find_bios_table_area(void)
{
unsigned long addr;
for(addr = 0xf0000; addr < 0x100000; addr += 16) {
@@ -634,17 +648,17 @@ static int find_bios_table_area(void)
bios_table_end_addr = bios_table_cur_addr + *(uint32_t *)(addr + 4);
BX_INFO("bios_table_addr: 0x%08lx end=0x%08lx\n",
bios_table_cur_addr, bios_table_end_addr);
- return 0;
+ return;
}
}
- return -1;
+ return;
}
static void bios_shadow_init(PCIDevice *d)
{
int v;
- if (find_bios_table_area() < 0)
+ if (bios_table_cur_addr == 0)
return;
/* remap the BIOS to shadow RAM an keep it read/write while we
@@ -1460,6 +1474,7 @@ void acpi_bios_init(void)
memset(facs, 0, sizeof(*facs));
memcpy(facs->signature, "FACS", 4);
facs->length = cpu_to_le32(sizeof(*facs));
+ BX_INFO("Firmware waking vector %p\n", &facs->firmware_waking_vector);
/* DSDT */
memcpy(dsdt, AmlCode, sizeof(AmlCode));
@@ -2010,9 +2025,48 @@ void smbios_init(void)
BX_INFO("SMBIOS table addr=0x%08lx\n", (unsigned long)start);
}
-void rombios32_init(void)
+static uint32_t find_resume_vector(void)
+{
+ unsigned long addr, start, end;
+
+#ifdef BX_USE_EBDA_TABLES
+ start = align(ebda_cur_addr, 16);
+ end = 0xa000 << 4;
+#else
+ if (bios_table_cur_addr == 0)
+ return 0;
+ start = align(bios_table_cur_addr, 16);
+ end = bios_table_end_addr;
+#endif
+
+ for (addr = start; addr < end; addr += 16) {
+ if (!memcmp((void*)addr, "RSD PTR ", 8)) {
+ struct rsdp_descriptor *rsdp = (void*)addr;
+ struct rsdt_descriptor_rev1 *rsdt = (void*)rsdp->rsdt_physical_address;
+ struct fadt_descriptor_rev1 *fadt = (void*)rsdt->table_offset_entry[0];
+ struct facs_descriptor_rev1 *facs = (void*)fadt->firmware_ctrl;
+ return facs->firmware_waking_vector;
+ }
+ }
+
+ return 0;
+}
+
+static void find_440fx(PCIDevice *d)
+{
+ uint16_t vendor_id, device_id;
+
+ vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
+ device_id = pci_config_readw(d, PCI_DEVICE_ID);
+
+ if (vendor_id == PCI_VENDOR_ID_INTEL && device_id == PCI_DEVICE_ID_INTEL_82441)
+ i440_pcidev = *d;
+}
+
+void rombios32_init(uint32_t *s3_resume_vector, uint8_t *shutdown_flag)
{
BX_INFO("Starting rombios32\n");
+ BX_INFO("Shutdown flag %x\n", *shutdown_flag);
#ifdef BX_QEMU
qemu_cfg_port = qemu_cfg_port_probe();
@@ -2024,6 +2078,21 @@ void rombios32_init(void)
smp_probe();
+ find_bios_table_area();
+
+ if (*shutdown_flag == 0xfe) {
+ *s3_resume_vector = find_resume_vector();
+ if (!*s3_resume_vector) {
+ BX_INFO("This is S3 resume but wakeup vector is NULL\n");
+ } else {
+ BX_INFO("S3 resume vector %p\n", *s3_resume_vector);
+ /* redirect bios read access to RAM */
+ pci_for_each_device(find_440fx);
+ bios_lock_shadow_ram(); /* bios is already copied */
+ }
+ return;
+ }
+
pci_bios_init();
if (bios_table_cur_addr != 0) {
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 2/5] Preserve memory content during SMM init.
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
@ 2008-11-16 9:33 ` Gleb Natapov
2008-11-17 23:51 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init Sebastian Herbszt
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 3/5] Execute rombios32 code from rom address 0xe0000 Gleb Natapov
` (3 subsequent siblings)
5 siblings, 1 reply; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:33 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
bios/rombios32.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/bios/rombios32.c b/bios/rombios32.c
index 7b354a8..7075aa9 100644
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -731,6 +731,12 @@ static void smm_init(PCIDevice *d)
value = pci_config_readl(d, 0x58);
if ((value & (1 << 25)) == 0) {
+ /* enable the SMM memory window */
+ pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x48);
+
+ /* save original memory content */
+ memcpy((void *)0xa8000, (void *)0x38000, 0x8000);
+
/* copy the SMM relocation code */
memcpy((void *)0x38000, &smm_relocation_start,
&smm_relocation_end - &smm_relocation_start);
@@ -747,8 +753,8 @@ static void smm_init(PCIDevice *d)
/* wait until SMM code executed */
while (inb(0xb3) != 0x00);
- /* enable the SMM memory window */
- pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x48);
+ /* restore original memory content */
+ memcpy((void *)0x38000, (void *)0xa8000, 0x8000);
/* copy the SMM code */
memcpy((void *)0xa8000, &smm_code_start,
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 3/5] Execute rombios32 code from rom address 0xe0000.
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 2/5] Preserve memory content during SMM init Gleb Natapov
@ 2008-11-16 9:34 ` Gleb Natapov
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 4/5] Don't use unreserved memory in BIOS Gleb Natapov
` (2 subsequent siblings)
5 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:34 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
bios/Makefile.in | 1 +
bios/rombios.c | 17 +----------------
bios/rombios32.ld | 10 ++++------
bios/rombios32start.S | 9 ++++++++-
4 files changed, 14 insertions(+), 23 deletions(-)
diff --git a/bios/Makefile.in b/bios/Makefile.in
index b055910..af674b4 100644
--- a/bios/Makefile.in
+++ b/bios/Makefile.in
@@ -106,6 +106,7 @@ rombios32.o: rombios32.c acpi-dsdt.hex
ifeq ("1", "0")
acpi-dsdt.hex: acpi-dsdt.dsl
iasl -tc -p $@ $<
+ sed -i -e's/^unsigned/const unsigned/' $@
endif
rombios32start.o: rombios32start.S
diff --git a/bios/rombios.c b/bios/rombios.c
index a34c6b2..4e555a9 100644
--- a/bios/rombios.c
+++ b/bios/rombios.c
@@ -10036,13 +10036,6 @@ rombios32_05:
mov gs, ax
cld
- ;; copy rombios32 code to ram (ram offset = 1MB)
- mov esi, #0xfffe0000
- mov edi, #0x00040000
- mov ecx, #0x10000 / 4
- rep
- movsd
-
;; init the stack pointer
mov esp, #0x00080000
@@ -10051,17 +10044,9 @@ rombios32_05:
push #0x04b2
;; call rombios32 code
- mov eax, #0x00040000
+ mov eax, #0x000e0000
call eax
- ;; reset the memory (some boot loaders such as syslinux suppose
- ;; that the memory is set to zero)
- mov edi, #0x00040000
- mov ecx, #0x40000 / 4
- xor eax, eax
- rep
- stosd
-
;; return to 16 bit protected mode first
db 0xea
dd rombios32_10
diff --git a/bios/rombios32.ld b/bios/rombios32.ld
index c7f6066..ff765c8 100644
--- a/bios/rombios32.ld
+++ b/bios/rombios32.ld
@@ -3,14 +3,12 @@ OUTPUT_ARCH(i386)
ENTRY(_start);
SECTIONS
{
- . = 0x00040000;
+ . = 0x000e0000;
.text : { *(.text) }
- .rodata : { *(.rodata) }
- . = ALIGN(4096);
- .data : { *(.data) }
- __bss_start = . ;
- .bss : { *(.bss) *(COMMON) }
+ .rodata : { *(.rodata*) }
_end = . ;
+ .data 0x700 : AT (_end) { __data_start = .; *(.data); __data_end = .;}
+ .bss : { __bss_start = .; *(.bss) *(COMMON); __bss_end = .;}
/DISCARD/ : { *(.stab)
*(.stabstr)
*(.comment)
diff --git a/bios/rombios32start.S b/bios/rombios32start.S
index 601e2b0..1900261 100644
--- a/bios/rombios32start.S
+++ b/bios/rombios32start.S
@@ -32,10 +32,17 @@ _start:
/* clear bss section */
xor %eax, %eax
mov $__bss_start, %edi
- mov $_end, %ecx
+ mov $__bss_end, %ecx
sub %edi, %ecx
rep stosb
+ /* copy data section */
+ mov $_end, %esi
+ mov $__data_start, %edi
+ mov $__data_end, %ecx
+ sub %edi, %ecx
+ rep movsb
+
jmp rombios32_init
.code16
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 4/5] Don't use unreserved memory in BIOS.
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
` (2 preceding siblings ...)
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 3/5] Execute rombios32 code from rom address 0xe0000 Gleb Natapov
@ 2008-11-16 9:34 ` Gleb Natapov
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 5/5] Don't power down vga card on entering S3 state Gleb Natapov
2008-11-16 17:35 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS Sebastian Herbszt
5 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:34 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
Use only first page and last page of low memory. OSes assumes that first
page is used by bios and last page is reserved in e820 map.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
bios/rombios.c | 11 +++++++----
bios/rombios.h | 1 -
bios/rombios32.c | 11 ++++-------
bios/rombios32start.S | 2 +-
4 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/bios/rombios.c b/bios/rombios.c
index 4e555a9..5a56716 100644
--- a/bios/rombios.c
+++ b/bios/rombios.c
@@ -4548,7 +4548,7 @@ ASM_END
{
case 0:
set_e820_range(ES, regs.u.r16.di,
- 0x0000000L, 0x0009fc00L, 1);
+ 0x0000000L, 0x0009f000L, 1);
regs.u.r32.ebx = 1;
regs.u.r32.eax = 0x534D4150;
regs.u.r32.ecx = 0x14;
@@ -4557,7 +4557,7 @@ ASM_END
break;
case 1:
set_e820_range(ES, regs.u.r16.di,
- 0x0009fc00L, 0x000a0000L, 2);
+ 0x0009f000L, 0x000a0000L, 2);
regs.u.r32.ebx = 2;
regs.u.r32.eax = 0x534D4150;
regs.u.r32.ecx = 0x14;
@@ -10036,8 +10036,11 @@ rombios32_05:
mov gs, ax
cld
- ;; init the stack pointer
- mov esp, #0x00080000
+ ;; init the stack pointer to point below EBDA
+ mov ax, [0x040e]
+ shl eax, #4
+ mov esp, #-0x10
+ add esp, eax
;; pass pointer to s3_resume_flag and s3_resume_vector to rombios32
push #0x04b0
diff --git a/bios/rombios.h b/bios/rombios.h
index f0ed88e..b3df88b 100644
--- a/bios/rombios.h
+++ b/bios/rombios.h
@@ -56,7 +56,6 @@
#define ACPI_DATA_SIZE 0x00010000L
#define PM_IO_BASE 0xb000
#define SMB_IO_BASE 0xb100
-#define CPU_COUNT_ADDR 0xf000
// Define the application NAME
#if defined(BX_QEMU)
diff --git a/bios/rombios32.c b/bios/rombios32.c
index 7075aa9..0363e41 100644
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -57,7 +57,7 @@ typedef unsigned long long uint64_t;
#define APIC_ENABLED 0x0100
-#define AP_BOOT_ADDR 0x10000
+#define AP_BOOT_ADDR 0x9f000
#define MPTABLE_MAX_SIZE 0x00002000
#define SMI_CMD_IO_ADDR 0xb2
@@ -392,7 +392,7 @@ void delay_ms(int n)
}
}
-int smp_cpus;
+uint16_t smp_cpus;
uint32_t cpuid_signature;
uint32_t cpuid_features;
uint32_t cpuid_ext_features;
@@ -495,7 +495,7 @@ void smp_probe(void)
{
uint32_t val, sipi_vector;
- smp_cpus = 1;
+ writew(&smp_cpus, 1);
if (cpuid_features & CPUID_APIC) {
/* enable local APIC */
@@ -503,7 +503,6 @@ void smp_probe(void)
val |= APIC_ENABLED;
writel(APIC_BASE + APIC_SVR, val);
- writew((void *)CPU_COUNT_ADDR, 1);
/* copy AP boot code */
memcpy((void *)AP_BOOT_ADDR, &smp_ap_boot_code_start,
&smp_ap_boot_code_end - &smp_ap_boot_code_start);
@@ -514,10 +513,8 @@ void smp_probe(void)
writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector);
delay_ms(10);
-
- smp_cpus = readw((void *)CPU_COUNT_ADDR);
}
- BX_INFO("Found %d cpu(s)\n", smp_cpus);
+ BX_INFO("Found %d cpu(s)\n", readw(&smp_cpus));
}
/****************************************************/
diff --git a/bios/rombios32start.S b/bios/rombios32start.S
index 1900261..836652c 100644
--- a/bios/rombios32start.S
+++ b/bios/rombios32start.S
@@ -49,7 +49,7 @@ _start:
smp_ap_boot_code_start:
xor %ax, %ax
mov %ax, %ds
- lock incw CPU_COUNT_ADDR
+ lock incw smp_cpus
1:
hlt
jmp 1b
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 5/5] Don't power down vga card on entering S3 state.
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
` (3 preceding siblings ...)
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 4/5] Don't use unreserved memory in BIOS Gleb Natapov
@ 2008-11-16 9:34 ` Gleb Natapov
2008-11-16 17:35 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS Sebastian Herbszt
5 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 9:34 UTC (permalink / raw)
To: bochs-developers; +Cc: qemu-devel
This is needed to fool windows to enter S3. The trick works for XP and
Windows2003, but Vista still refuse to allow S3.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
---
bios/acpi-dsdt.dsl | 15 ++
bios/acpi-dsdt.hex | 373 ++++++++++++++++++++++++++--------------------------
2 files changed, 204 insertions(+), 184 deletions(-)
diff --git a/bios/acpi-dsdt.dsl b/bios/acpi-dsdt.dsl
index 280a05e..5fc3636 100644
--- a/bios/acpi-dsdt.dsl
+++ b/bios/acpi-dsdt.dsl
@@ -133,6 +133,21 @@ DefinitionBlock (
}
Scope(\_SB.PCI0) {
+ Device (VGA) {
+ Name (_ADR, 0x00020000)
+ Method (_S1D, 0, NotSerialized)
+ {
+ Return (0x00)
+ }
+ Method (_S2D, 0, NotSerialized)
+ {
+ Return (0x00)
+ }
+ Method (_S3D, 0, NotSerialized)
+ {
+ Return (0x00)
+ }
+ }
/* PIIX3 ISA bridge */
Device (ISA) {
diff --git a/bios/acpi-dsdt.hex b/bios/acpi-dsdt.hex
index 6088b18..a4c64e6 100644
--- a/bios/acpi-dsdt.hex
+++ b/bios/acpi-dsdt.hex
@@ -5,15 +5,15 @@
* Copyright (C) 2000 - 2006 Intel Corporation
* Supports ACPI Specification Revision 3.0a
*
- * Compilation of "acpi-dsdt.dsl" - Mon Oct 27 10:37:05 2008
+ * Compilation of "acpi-dsdt.dsl" - Mon Oct 27 10:39:43 2008
*
* C source code output
*
*/
const unsigned char AmlCode[] =
{
- 0x44,0x53,0x44,0x54,0xE1,0x07,0x00,0x00, /* 00000000 "DSDT...." */
- 0x01,0x24,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 ".$BXPC.." */
+ 0x44,0x53,0x44,0x54,0x0D,0x08,0x00,0x00, /* 00000000 "DSDT...." */
+ 0x01,0xA1,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 "..BXPC.." */
0x42,0x58,0x44,0x53,0x44,0x54,0x00,0x00, /* 00000010 "BXDSDT.." */
0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
0x09,0x11,0x06,0x20,0x10,0x1C,0x5C,0x00, /* 00000020 "... ..\." */
@@ -83,186 +83,191 @@ const unsigned char AmlCode[] =
0x17,0x00,0x00,0x0C,0x01,0x00,0x00,0x00, /* 00000220 "........" */
0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xBF, /* 00000228 "........" */
0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0xC0, /* 00000230 "........" */
- 0x1E,0x79,0x00,0x10,0x41,0x29,0x2E,0x5F, /* 00000238 ".y..A)._" */
+ 0x1E,0x79,0x00,0x10,0x4D,0x2B,0x2E,0x5F, /* 00000238 ".y..M+._" */
0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x5B, /* 00000240 "SB_PCI0[" */
- 0x82,0x42,0x23,0x49,0x53,0x41,0x5F,0x08, /* 00000248 ".B#ISA_." */
- 0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x01, /* 00000250 "_ADR...." */
- 0x00,0x5B,0x80,0x50,0x34,0x30,0x43,0x02, /* 00000258 ".[.P40C." */
- 0x0A,0x60,0x0A,0x04,0x5B,0x82,0x2D,0x52, /* 00000260 ".`..[.-R" */
- 0x54,0x43,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000268 "TC_._HID" */
- 0x0C,0x41,0xD0,0x0B,0x00,0x08,0x5F,0x43, /* 00000270 ".A...._C" */
- 0x52,0x53,0x11,0x18,0x0A,0x15,0x47,0x01, /* 00000278 "RS....G." */
- 0x70,0x00,0x70,0x00,0x10,0x02,0x22,0x00, /* 00000280 "p.p..."." */
- 0x01,0x47,0x01,0x72,0x00,0x72,0x00,0x02, /* 00000288 ".G.r.r.." */
- 0x06,0x79,0x00,0x5B,0x82,0x44,0x04,0x4B, /* 00000290 ".y.[.D.K" */
- 0x42,0x44,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000298 "BD_._HID" */
- 0x0C,0x41,0xD0,0x03,0x03,0x14,0x09,0x5F, /* 000002A0 ".A....._" */
- 0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x14, /* 000002A8 "STA....." */
- 0x29,0x5F,0x43,0x52,0x53,0x00,0x08,0x54, /* 000002B0 ")_CRS..T" */
- 0x4D,0x50,0x5F,0x11,0x18,0x0A,0x15,0x47, /* 000002B8 "MP_....G" */
- 0x01,0x60,0x00,0x60,0x00,0x01,0x01,0x47, /* 000002C0 ".`.`...G" */
- 0x01,0x64,0x00,0x64,0x00,0x01,0x01,0x22, /* 000002C8 ".d.d..."" */
- 0x02,0x00,0x79,0x00,0xA4,0x54,0x4D,0x50, /* 000002D0 "..y..TMP" */
- 0x5F,0x5B,0x82,0x33,0x4D,0x4F,0x55,0x5F, /* 000002D8 "_[.3MOU_" */
- 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 000002E0 "._HID.A." */
- 0x0F,0x13,0x14,0x09,0x5F,0x53,0x54,0x41, /* 000002E8 "...._STA" */
- 0x00,0xA4,0x0A,0x0F,0x14,0x19,0x5F,0x43, /* 000002F0 "......_C" */
- 0x52,0x53,0x00,0x08,0x54,0x4D,0x50,0x5F, /* 000002F8 "RS..TMP_" */
- 0x11,0x08,0x0A,0x05,0x22,0x00,0x10,0x79, /* 00000300 "...."..y" */
- 0x00,0xA4,0x54,0x4D,0x50,0x5F,0x5B,0x82, /* 00000308 "..TMP_[." */
- 0x47,0x04,0x46,0x44,0x43,0x30,0x08,0x5F, /* 00000310 "G.FDC0._" */
- 0x48,0x49,0x44,0x0C,0x41,0xD0,0x07,0x00, /* 00000318 "HID.A..." */
- 0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4, /* 00000320 ".._STA.." */
- 0x0A,0x0F,0x14,0x2C,0x5F,0x43,0x52,0x53, /* 00000328 "...,_CRS" */
- 0x00,0x08,0x42,0x55,0x46,0x30,0x11,0x1B, /* 00000330 "..BUF0.." */
- 0x0A,0x18,0x47,0x01,0xF2,0x03,0xF2,0x03, /* 00000338 "..G....." */
- 0x00,0x04,0x47,0x01,0xF7,0x03,0xF7,0x03, /* 00000340 "..G....." */
- 0x00,0x01,0x22,0x40,0x00,0x2A,0x04,0x00, /* 00000348 ".."@.*.." */
- 0x79,0x00,0xA4,0x42,0x55,0x46,0x30,0x5B, /* 00000350 "y..BUF0[" */
- 0x82,0x4B,0x05,0x4C,0x50,0x54,0x5F,0x08, /* 00000358 ".K.LPT_." */
- 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x04, /* 00000360 "_HID.A.." */
- 0x00,0x14,0x28,0x5F,0x53,0x54,0x41,0x00, /* 00000368 "..(_STA." */
- 0x70,0x5E,0x5E,0x5E,0x2E,0x50,0x58,0x31, /* 00000370 "p^^^.PX1" */
- 0x33,0x44,0x52,0x53,0x41,0x60,0x7B,0x60, /* 00000378 "3DRSA`{`" */
- 0x0C,0x00,0x00,0x00,0x80,0x60,0xA0,0x06, /* 00000380 ".....`.." */
- 0x93,0x60,0x00,0xA4,0x00,0xA1,0x04,0xA4, /* 00000388 ".`......" */
- 0x0A,0x0F,0x14,0x21,0x5F,0x43,0x52,0x53, /* 00000390 "...!_CRS" */
- 0x00,0x08,0x42,0x55,0x46,0x30,0x11,0x10, /* 00000398 "..BUF0.." */
- 0x0A,0x0D,0x47,0x01,0x78,0x03,0x78,0x03, /* 000003A0 "..G.x.x." */
- 0x08,0x08,0x22,0x80,0x00,0x79,0x00,0xA4, /* 000003A8 ".."..y.." */
- 0x42,0x55,0x46,0x30,0x5B,0x82,0x41,0x06, /* 000003B0 "BUF0[.A." */
- 0x43,0x4F,0x4D,0x31,0x08,0x5F,0x48,0x49, /* 000003B8 "COM1._HI" */
- 0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F, /* 000003C0 "D.A...._" */
- 0x55,0x49,0x44,0x01,0x14,0x28,0x5F,0x53, /* 000003C8 "UID..(_S" */
- 0x54,0x41,0x00,0x70,0x5E,0x5E,0x5E,0x2E, /* 000003D0 "TA.p^^^." */
- 0x50,0x58,0x31,0x33,0x44,0x52,0x53,0x43, /* 000003D8 "PX13DRSC" */
- 0x60,0x7B,0x60,0x0C,0x00,0x00,0x00,0x08, /* 000003E0 "`{`....." */
- 0x60,0xA0,0x06,0x93,0x60,0x00,0xA4,0x00, /* 000003E8 "`...`..." */
- 0xA1,0x04,0xA4,0x0A,0x0F,0x14,0x21,0x5F, /* 000003F0 "......!_" */
- 0x43,0x52,0x53,0x00,0x08,0x42,0x55,0x46, /* 000003F8 "CRS..BUF" */
- 0x30,0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8, /* 00000400 "0....G.." */
- 0x03,0xF8,0x03,0x00,0x08,0x22,0x10,0x00, /* 00000408 ".....".." */
- 0x79,0x00,0xA4,0x42,0x55,0x46,0x30,0x5B, /* 00000410 "y..BUF0[" */
- 0x82,0x42,0x06,0x43,0x4F,0x4D,0x32,0x08, /* 00000418 ".B.COM2." */
- 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x05, /* 00000420 "_HID.A.." */
- 0x01,0x08,0x5F,0x55,0x49,0x44,0x0A,0x02, /* 00000428 ".._UID.." */
- 0x14,0x28,0x5F,0x53,0x54,0x41,0x00,0x70, /* 00000430 ".(_STA.p" */
- 0x5E,0x5E,0x5E,0x2E,0x50,0x58,0x31,0x33, /* 00000438 "^^^.PX13" */
- 0x44,0x52,0x53,0x43,0x60,0x7B,0x60,0x0C, /* 00000440 "DRSC`{`." */
- 0x00,0x00,0x00,0x80,0x60,0xA0,0x06,0x93, /* 00000448 "....`..." */
- 0x60,0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A, /* 00000450 "`......." */
- 0x0F,0x14,0x21,0x5F,0x43,0x52,0x53,0x00, /* 00000458 "..!_CRS." */
- 0x08,0x42,0x55,0x46,0x30,0x11,0x10,0x0A, /* 00000460 ".BUF0..." */
- 0x0D,0x47,0x01,0xF8,0x02,0xF8,0x02,0x00, /* 00000468 ".G......" */
- 0x08,0x22,0x08,0x00,0x79,0x00,0xA4,0x42, /* 00000470 "."..y..B" */
- 0x55,0x46,0x30,0x5B,0x82,0x40,0x05,0x50, /* 00000478 "UF0[.@.P" */
- 0x58,0x31,0x33,0x08,0x5F,0x41,0x44,0x52, /* 00000480 "X13._ADR" */
- 0x0C,0x03,0x00,0x01,0x00,0x5B,0x80,0x50, /* 00000488 ".....[.P" */
- 0x31,0x33,0x43,0x02,0x0A,0x5C,0x0A,0x24, /* 00000490 "13C..\.$" */
- 0x5B,0x81,0x33,0x50,0x31,0x33,0x43,0x03, /* 00000498 "[.3P13C." */
- 0x44,0x52,0x53,0x41,0x20,0x44,0x52,0x53, /* 000004A0 "DRSA DRS" */
- 0x42,0x20,0x44,0x52,0x53,0x43,0x20,0x44, /* 000004A8 "B DRSC D" */
- 0x52,0x53,0x45,0x20,0x44,0x52,0x53,0x46, /* 000004B0 "RSE DRSF" */
- 0x20,0x44,0x52,0x53,0x47,0x20,0x44,0x52, /* 000004B8 " DRSG DR" */
- 0x53,0x48,0x20,0x44,0x52,0x53,0x49,0x20, /* 000004C0 "SH DRSI " */
- 0x44,0x52,0x53,0x4A,0x20,0x10,0x4F,0x2E, /* 000004C8 "DRSJ .O." */
- 0x5F,0x53,0x42,0x5F,0x5B,0x81,0x24,0x2F, /* 000004D0 "_SB_[.$/" */
- 0x03,0x50,0x43,0x49,0x30,0x49,0x53,0x41, /* 000004D8 ".PCI0ISA" */
- 0x5F,0x50,0x34,0x30,0x43,0x01,0x50,0x52, /* 000004E0 "_P40C.PR" */
- 0x51,0x30,0x08,0x50,0x52,0x51,0x31,0x08, /* 000004E8 "Q0.PRQ1." */
- 0x50,0x52,0x51,0x32,0x08,0x50,0x52,0x51, /* 000004F0 "PRQ2.PRQ" */
- 0x33,0x08,0x5B,0x82,0x4E,0x0A,0x4C,0x4E, /* 000004F8 "3.[.N.LN" */
- 0x4B,0x41,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 00000500 "KA._HID." */
- 0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49, /* 00000508 "A...._UI" */
- 0x44,0x01,0x08,0x5F,0x50,0x52,0x53,0x11, /* 00000510 "D.._PRS." */
- 0x09,0x0A,0x06,0x23,0xF8,0x1E,0x18,0x79, /* 00000518 "...#...y" */
- 0x00,0x14,0x1A,0x5F,0x53,0x54,0x41,0x00, /* 00000520 "..._STA." */
- 0x70,0x0A,0x0B,0x60,0xA0,0x0D,0x7B,0x0A, /* 00000528 "p..`..{." */
- 0x80,0x50,0x52,0x51,0x30,0x61,0x70,0x0A, /* 00000530 ".PRQ0ap." */
- 0x09,0x60,0xA4,0x60,0x14,0x11,0x5F,0x44, /* 00000538 ".`.`.._D" */
- 0x49,0x53,0x00,0x7D,0x50,0x52,0x51,0x30, /* 00000540 "IS.}PRQ0" */
- 0x0A,0x80,0x50,0x52,0x51,0x30,0x14,0x3F, /* 00000548 "..PRQ0.?" */
- 0x5F,0x43,0x52,0x53,0x00,0x08,0x50,0x52, /* 00000550 "_CRS..PR" */
- 0x52,0x30,0x11,0x09,0x0A,0x06,0x23,0x02, /* 00000558 "R0....#." */
- 0x00,0x18,0x79,0x00,0x8B,0x50,0x52,0x52, /* 00000560 "..y..PRR" */
- 0x30,0x01,0x54,0x4D,0x50,0x5F,0x70,0x50, /* 00000568 "0.TMP_pP" */
- 0x52,0x51,0x30,0x60,0xA0,0x0C,0x95,0x60, /* 00000570 "RQ0`...`" */
- 0x0A,0x80,0x79,0x01,0x60,0x54,0x4D,0x50, /* 00000578 "..y.`TMP" */
- 0x5F,0xA1,0x07,0x70,0x00,0x54,0x4D,0x50, /* 00000580 "_..p.TMP" */
- 0x5F,0xA4,0x50,0x52,0x52,0x30,0x14,0x1B, /* 00000588 "_.PRR0.." */
- 0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01, /* 00000590 "_SRS..h." */
- 0x54,0x4D,0x50,0x5F,0x82,0x54,0x4D,0x50, /* 00000598 "TMP_.TMP" */
- 0x5F,0x60,0x76,0x60,0x70,0x60,0x50,0x52, /* 000005A0 "_`v`p`PR" */
- 0x51,0x30,0x5B,0x82,0x4F,0x0A,0x4C,0x4E, /* 000005A8 "Q0[.O.LN" */
- 0x4B,0x42,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 000005B0 "KB._HID." */
- 0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49, /* 000005B8 "A...._UI" */
- 0x44,0x0A,0x02,0x08,0x5F,0x50,0x52,0x53, /* 000005C0 "D..._PRS" */
- 0x11,0x09,0x0A,0x06,0x23,0xF8,0x1E,0x18, /* 000005C8 "....#..." */
- 0x79,0x00,0x14,0x1A,0x5F,0x53,0x54,0x41, /* 000005D0 "y..._STA" */
- 0x00,0x70,0x0A,0x0B,0x60,0xA0,0x0D,0x7B, /* 000005D8 ".p..`..{" */
- 0x0A,0x80,0x50,0x52,0x51,0x31,0x61,0x70, /* 000005E0 "..PRQ1ap" */
- 0x0A,0x09,0x60,0xA4,0x60,0x14,0x11,0x5F, /* 000005E8 "..`.`.._" */
- 0x44,0x49,0x53,0x00,0x7D,0x50,0x52,0x51, /* 000005F0 "DIS.}PRQ" */
- 0x31,0x0A,0x80,0x50,0x52,0x51,0x31,0x14, /* 000005F8 "1..PRQ1." */
- 0x3F,0x5F,0x43,0x52,0x53,0x00,0x08,0x50, /* 00000600 "?_CRS..P" */
- 0x52,0x52,0x30,0x11,0x09,0x0A,0x06,0x23, /* 00000608 "RR0....#" */
- 0x02,0x00,0x18,0x79,0x00,0x8B,0x50,0x52, /* 00000610 "...y..PR" */
- 0x52,0x30,0x01,0x54,0x4D,0x50,0x5F,0x70, /* 00000618 "R0.TMP_p" */
- 0x50,0x52,0x51,0x31,0x60,0xA0,0x0C,0x95, /* 00000620 "PRQ1`..." */
- 0x60,0x0A,0x80,0x79,0x01,0x60,0x54,0x4D, /* 00000628 "`..y.`TM" */
- 0x50,0x5F,0xA1,0x07,0x70,0x00,0x54,0x4D, /* 00000630 "P_..p.TM" */
- 0x50,0x5F,0xA4,0x50,0x52,0x52,0x30,0x14, /* 00000638 "P_.PRR0." */
- 0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68, /* 00000640 "._SRS..h" */
- 0x01,0x54,0x4D,0x50,0x5F,0x82,0x54,0x4D, /* 00000648 ".TMP_.TM" */
- 0x50,0x5F,0x60,0x76,0x60,0x70,0x60,0x50, /* 00000650 "P_`v`p`P" */
- 0x52,0x51,0x31,0x5B,0x82,0x4F,0x0A,0x4C, /* 00000658 "RQ1[.O.L" */
- 0x4E,0x4B,0x43,0x08,0x5F,0x48,0x49,0x44, /* 00000660 "NKC._HID" */
- 0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55, /* 00000668 ".A...._U" */
- 0x49,0x44,0x0A,0x03,0x08,0x5F,0x50,0x52, /* 00000670 "ID..._PR" */
- 0x53,0x11,0x09,0x0A,0x06,0x23,0xF8,0x1E, /* 00000678 "S....#.." */
- 0x18,0x79,0x00,0x14,0x1A,0x5F,0x53,0x54, /* 00000680 ".y..._ST" */
- 0x41,0x00,0x70,0x0A,0x0B,0x60,0xA0,0x0D, /* 00000688 "A.p..`.." */
- 0x7B,0x0A,0x80,0x50,0x52,0x51,0x32,0x61, /* 00000690 "{..PRQ2a" */
- 0x70,0x0A,0x09,0x60,0xA4,0x60,0x14,0x11, /* 00000698 "p..`.`.." */
- 0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x52, /* 000006A0 "_DIS.}PR" */
- 0x51,0x32,0x0A,0x80,0x50,0x52,0x51,0x32, /* 000006A8 "Q2..PRQ2" */
- 0x14,0x3F,0x5F,0x43,0x52,0x53,0x00,0x08, /* 000006B0 ".?_CRS.." */
- 0x50,0x52,0x52,0x30,0x11,0x09,0x0A,0x06, /* 000006B8 "PRR0...." */
- 0x23,0x02,0x00,0x18,0x79,0x00,0x8B,0x50, /* 000006C0 "#...y..P" */
- 0x52,0x52,0x30,0x01,0x54,0x4D,0x50,0x5F, /* 000006C8 "RR0.TMP_" */
- 0x70,0x50,0x52,0x51,0x32,0x60,0xA0,0x0C, /* 000006D0 "pPRQ2`.." */
- 0x95,0x60,0x0A,0x80,0x79,0x01,0x60,0x54, /* 000006D8 ".`..y.`T" */
- 0x4D,0x50,0x5F,0xA1,0x07,0x70,0x00,0x54, /* 000006E0 "MP_..p.T" */
- 0x4D,0x50,0x5F,0xA4,0x50,0x52,0x52,0x30, /* 000006E8 "MP_.PRR0" */
- 0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B, /* 000006F0 ".._SRS.." */
- 0x68,0x01,0x54,0x4D,0x50,0x5F,0x82,0x54, /* 000006F8 "h.TMP_.T" */
- 0x4D,0x50,0x5F,0x60,0x76,0x60,0x70,0x60, /* 00000700 "MP_`v`p`" */
- 0x50,0x52,0x51,0x32,0x5B,0x82,0x4F,0x0A, /* 00000708 "PRQ2[.O." */
- 0x4C,0x4E,0x4B,0x44,0x08,0x5F,0x48,0x49, /* 00000710 "LNKD._HI" */
- 0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F, /* 00000718 "D.A...._" */
- 0x55,0x49,0x44,0x0A,0x04,0x08,0x5F,0x50, /* 00000720 "UID..._P" */
- 0x52,0x53,0x11,0x09,0x0A,0x06,0x23,0xF8, /* 00000728 "RS....#." */
- 0x1E,0x18,0x79,0x00,0x14,0x1A,0x5F,0x53, /* 00000730 "..y..._S" */
- 0x54,0x41,0x00,0x70,0x0A,0x0B,0x60,0xA0, /* 00000738 "TA.p..`." */
- 0x0D,0x7B,0x0A,0x80,0x50,0x52,0x51,0x33, /* 00000740 ".{..PRQ3" */
- 0x61,0x70,0x0A,0x09,0x60,0xA4,0x60,0x14, /* 00000748 "ap..`.`." */
- 0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50, /* 00000750 "._DIS.}P" */
- 0x52,0x51,0x33,0x0A,0x80,0x50,0x52,0x51, /* 00000758 "RQ3..PRQ" */
- 0x33,0x14,0x3F,0x5F,0x43,0x52,0x53,0x00, /* 00000760 "3.?_CRS." */
- 0x08,0x50,0x52,0x52,0x30,0x11,0x09,0x0A, /* 00000768 ".PRR0..." */
- 0x06,0x23,0x02,0x00,0x18,0x79,0x00,0x8B, /* 00000770 ".#...y.." */
- 0x50,0x52,0x52,0x30,0x01,0x54,0x4D,0x50, /* 00000778 "PRR0.TMP" */
- 0x5F,0x70,0x50,0x52,0x51,0x33,0x60,0xA0, /* 00000780 "_pPRQ3`." */
- 0x0C,0x95,0x60,0x0A,0x80,0x79,0x01,0x60, /* 00000788 "..`..y.`" */
- 0x54,0x4D,0x50,0x5F,0xA1,0x07,0x70,0x00, /* 00000790 "TMP_..p." */
- 0x54,0x4D,0x50,0x5F,0xA4,0x50,0x52,0x52, /* 00000798 "TMP_.PRR" */
- 0x30,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01, /* 000007A0 "0.._SRS." */
- 0x8B,0x68,0x01,0x54,0x4D,0x50,0x5F,0x82, /* 000007A8 ".h.TMP_." */
- 0x54,0x4D,0x50,0x5F,0x60,0x76,0x60,0x70, /* 000007B0 "TMP_`v`p" */
- 0x60,0x50,0x52,0x51,0x33,0x08,0x5F,0x53, /* 000007B8 "`PRQ3._S" */
- 0x33,0x5F,0x12,0x06,0x04,0x01,0x01,0x00, /* 000007C0 "3_......" */
- 0x00,0x08,0x5F,0x53,0x34,0x5F,0x12,0x06, /* 000007C8 ".._S4_.." */
- 0x04,0x00,0x00,0x00,0x00,0x08,0x5F,0x53, /* 000007D0 "......_S" */
- 0x35,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007D8 "5_......" */
- 0x00,
+ 0x82,0x2A,0x56,0x47,0x41,0x5F,0x08,0x5F, /* 00000248 ".*VGA_._" */
+ 0x41,0x44,0x52,0x0C,0x00,0x00,0x02,0x00, /* 00000250 "ADR....." */
+ 0x14,0x08,0x5F,0x53,0x31,0x44,0x00,0xA4, /* 00000258 ".._S1D.." */
+ 0x00,0x14,0x08,0x5F,0x53,0x32,0x44,0x00, /* 00000260 "..._S2D." */
+ 0xA4,0x00,0x14,0x08,0x5F,0x53,0x33,0x44, /* 00000268 "...._S3D" */
+ 0x00,0xA4,0x00,0x5B,0x82,0x42,0x23,0x49, /* 00000270 "...[.B#I" */
+ 0x53,0x41,0x5F,0x08,0x5F,0x41,0x44,0x52, /* 00000278 "SA_._ADR" */
+ 0x0C,0x00,0x00,0x01,0x00,0x5B,0x80,0x50, /* 00000280 ".....[.P" */
+ 0x34,0x30,0x43,0x02,0x0A,0x60,0x0A,0x04, /* 00000288 "40C..`.." */
+ 0x5B,0x82,0x2D,0x52,0x54,0x43,0x5F,0x08, /* 00000290 "[.-RTC_." */
+ 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B, /* 00000298 "_HID.A.." */
+ 0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x18, /* 000002A0 ".._CRS.." */
+ 0x0A,0x15,0x47,0x01,0x70,0x00,0x70,0x00, /* 000002A8 "..G.p.p." */
+ 0x10,0x02,0x22,0x00,0x01,0x47,0x01,0x72, /* 000002B0 ".."..G.r" */
+ 0x00,0x72,0x00,0x02,0x06,0x79,0x00,0x5B, /* 000002B8 ".r...y.[" */
+ 0x82,0x44,0x04,0x4B,0x42,0x44,0x5F,0x08, /* 000002C0 ".D.KBD_." */
+ 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x03, /* 000002C8 "_HID.A.." */
+ 0x03,0x14,0x09,0x5F,0x53,0x54,0x41,0x00, /* 000002D0 "..._STA." */
+ 0xA4,0x0A,0x0F,0x14,0x29,0x5F,0x43,0x52, /* 000002D8 "....)_CR" */
+ 0x53,0x00,0x08,0x54,0x4D,0x50,0x5F,0x11, /* 000002E0 "S..TMP_." */
+ 0x18,0x0A,0x15,0x47,0x01,0x60,0x00,0x60, /* 000002E8 "...G.`.`" */
+ 0x00,0x01,0x01,0x47,0x01,0x64,0x00,0x64, /* 000002F0 "...G.d.d" */
+ 0x00,0x01,0x01,0x22,0x02,0x00,0x79,0x00, /* 000002F8 "..."..y." */
+ 0xA4,0x54,0x4D,0x50,0x5F,0x5B,0x82,0x33, /* 00000300 ".TMP_[.3" */
+ 0x4D,0x4F,0x55,0x5F,0x08,0x5F,0x48,0x49, /* 00000308 "MOU_._HI" */
+ 0x44,0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09, /* 00000310 "D.A....." */
+ 0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F, /* 00000318 "_STA...." */
+ 0x14,0x19,0x5F,0x43,0x52,0x53,0x00,0x08, /* 00000320 ".._CRS.." */
+ 0x54,0x4D,0x50,0x5F,0x11,0x08,0x0A,0x05, /* 00000328 "TMP_...." */
+ 0x22,0x00,0x10,0x79,0x00,0xA4,0x54,0x4D, /* 00000330 ""..y..TM" */
+ 0x50,0x5F,0x5B,0x82,0x47,0x04,0x46,0x44, /* 00000338 "P_[.G.FD" */
+ 0x43,0x30,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 00000340 "C0._HID." */
+ 0x41,0xD0,0x07,0x00,0x14,0x09,0x5F,0x53, /* 00000348 "A....._S" */
+ 0x54,0x41,0x00,0xA4,0x0A,0x0F,0x14,0x2C, /* 00000350 "TA.....," */
+ 0x5F,0x43,0x52,0x53,0x00,0x08,0x42,0x55, /* 00000358 "_CRS..BU" */
+ 0x46,0x30,0x11,0x1B,0x0A,0x18,0x47,0x01, /* 00000360 "F0....G." */
+ 0xF2,0x03,0xF2,0x03,0x00,0x04,0x47,0x01, /* 00000368 "......G." */
+ 0xF7,0x03,0xF7,0x03,0x00,0x01,0x22,0x40, /* 00000370 "......"@" */
+ 0x00,0x2A,0x04,0x00,0x79,0x00,0xA4,0x42, /* 00000378 ".*..y..B" */
+ 0x55,0x46,0x30,0x5B,0x82,0x4B,0x05,0x4C, /* 00000380 "UF0[.K.L" */
+ 0x50,0x54,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000388 "PT_._HID" */
+ 0x0C,0x41,0xD0,0x04,0x00,0x14,0x28,0x5F, /* 00000390 ".A....(_" */
+ 0x53,0x54,0x41,0x00,0x70,0x5E,0x5E,0x5E, /* 00000398 "STA.p^^^" */
+ 0x2E,0x50,0x58,0x31,0x33,0x44,0x52,0x53, /* 000003A0 ".PX13DRS" */
+ 0x41,0x60,0x7B,0x60,0x0C,0x00,0x00,0x00, /* 000003A8 "A`{`...." */
+ 0x80,0x60,0xA0,0x06,0x93,0x60,0x00,0xA4, /* 000003B0 ".`...`.." */
+ 0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x14,0x21, /* 000003B8 ".......!" */
+ 0x5F,0x43,0x52,0x53,0x00,0x08,0x42,0x55, /* 000003C0 "_CRS..BU" */
+ 0x46,0x30,0x11,0x10,0x0A,0x0D,0x47,0x01, /* 000003C8 "F0....G." */
+ 0x78,0x03,0x78,0x03,0x08,0x08,0x22,0x80, /* 000003D0 "x.x..."." */
+ 0x00,0x79,0x00,0xA4,0x42,0x55,0x46,0x30, /* 000003D8 ".y..BUF0" */
+ 0x5B,0x82,0x41,0x06,0x43,0x4F,0x4D,0x31, /* 000003E0 "[.A.COM1" */
+ 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 000003E8 "._HID.A." */
+ 0x05,0x01,0x08,0x5F,0x55,0x49,0x44,0x01, /* 000003F0 "..._UID." */
+ 0x14,0x28,0x5F,0x53,0x54,0x41,0x00,0x70, /* 000003F8 ".(_STA.p" */
+ 0x5E,0x5E,0x5E,0x2E,0x50,0x58,0x31,0x33, /* 00000400 "^^^.PX13" */
+ 0x44,0x52,0x53,0x43,0x60,0x7B,0x60,0x0C, /* 00000408 "DRSC`{`." */
+ 0x00,0x00,0x00,0x08,0x60,0xA0,0x06,0x93, /* 00000410 "....`..." */
+ 0x60,0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A, /* 00000418 "`......." */
+ 0x0F,0x14,0x21,0x5F,0x43,0x52,0x53,0x00, /* 00000420 "..!_CRS." */
+ 0x08,0x42,0x55,0x46,0x30,0x11,0x10,0x0A, /* 00000428 ".BUF0..." */
+ 0x0D,0x47,0x01,0xF8,0x03,0xF8,0x03,0x00, /* 00000430 ".G......" */
+ 0x08,0x22,0x10,0x00,0x79,0x00,0xA4,0x42, /* 00000438 "."..y..B" */
+ 0x55,0x46,0x30,0x5B,0x82,0x42,0x06,0x43, /* 00000440 "UF0[.B.C" */
+ 0x4F,0x4D,0x32,0x08,0x5F,0x48,0x49,0x44, /* 00000448 "OM2._HID" */
+ 0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F,0x55, /* 00000450 ".A...._U" */
+ 0x49,0x44,0x0A,0x02,0x14,0x28,0x5F,0x53, /* 00000458 "ID...(_S" */
+ 0x54,0x41,0x00,0x70,0x5E,0x5E,0x5E,0x2E, /* 00000460 "TA.p^^^." */
+ 0x50,0x58,0x31,0x33,0x44,0x52,0x53,0x43, /* 00000468 "PX13DRSC" */
+ 0x60,0x7B,0x60,0x0C,0x00,0x00,0x00,0x80, /* 00000470 "`{`....." */
+ 0x60,0xA0,0x06,0x93,0x60,0x00,0xA4,0x00, /* 00000478 "`...`..." */
+ 0xA1,0x04,0xA4,0x0A,0x0F,0x14,0x21,0x5F, /* 00000480 "......!_" */
+ 0x43,0x52,0x53,0x00,0x08,0x42,0x55,0x46, /* 00000488 "CRS..BUF" */
+ 0x30,0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8, /* 00000490 "0....G.." */
+ 0x02,0xF8,0x02,0x00,0x08,0x22,0x08,0x00, /* 00000498 ".....".." */
+ 0x79,0x00,0xA4,0x42,0x55,0x46,0x30,0x5B, /* 000004A0 "y..BUF0[" */
+ 0x82,0x40,0x05,0x50,0x58,0x31,0x33,0x08, /* 000004A8 ".@.PX13." */
+ 0x5F,0x41,0x44,0x52,0x0C,0x03,0x00,0x01, /* 000004B0 "_ADR...." */
+ 0x00,0x5B,0x80,0x50,0x31,0x33,0x43,0x02, /* 000004B8 ".[.P13C." */
+ 0x0A,0x5C,0x0A,0x24,0x5B,0x81,0x33,0x50, /* 000004C0 ".\.$[.3P" */
+ 0x31,0x33,0x43,0x03,0x44,0x52,0x53,0x41, /* 000004C8 "13C.DRSA" */
+ 0x20,0x44,0x52,0x53,0x42,0x20,0x44,0x52, /* 000004D0 " DRSB DR" */
+ 0x53,0x43,0x20,0x44,0x52,0x53,0x45,0x20, /* 000004D8 "SC DRSE " */
+ 0x44,0x52,0x53,0x46,0x20,0x44,0x52,0x53, /* 000004E0 "DRSF DRS" */
+ 0x47,0x20,0x44,0x52,0x53,0x48,0x20,0x44, /* 000004E8 "G DRSH D" */
+ 0x52,0x53,0x49,0x20,0x44,0x52,0x53,0x4A, /* 000004F0 "RSI DRSJ" */
+ 0x20,0x10,0x4F,0x2E,0x5F,0x53,0x42,0x5F, /* 000004F8 " .O._SB_" */
+ 0x5B,0x81,0x24,0x2F,0x03,0x50,0x43,0x49, /* 00000500 "[.$/.PCI" */
+ 0x30,0x49,0x53,0x41,0x5F,0x50,0x34,0x30, /* 00000508 "0ISA_P40" */
+ 0x43,0x01,0x50,0x52,0x51,0x30,0x08,0x50, /* 00000510 "C.PRQ0.P" */
+ 0x52,0x51,0x31,0x08,0x50,0x52,0x51,0x32, /* 00000518 "RQ1.PRQ2" */
+ 0x08,0x50,0x52,0x51,0x33,0x08,0x5B,0x82, /* 00000520 ".PRQ3.[." */
+ 0x4E,0x0A,0x4C,0x4E,0x4B,0x41,0x08,0x5F, /* 00000528 "N.LNKA._" */
+ 0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F, /* 00000530 "HID.A..." */
+ 0x08,0x5F,0x55,0x49,0x44,0x01,0x08,0x5F, /* 00000538 "._UID.._" */
+ 0x50,0x52,0x53,0x11,0x09,0x0A,0x06,0x23, /* 00000540 "PRS....#" */
+ 0xF8,0x1E,0x18,0x79,0x00,0x14,0x1A,0x5F, /* 00000548 "...y..._" */
+ 0x53,0x54,0x41,0x00,0x70,0x0A,0x0B,0x60, /* 00000550 "STA.p..`" */
+ 0xA0,0x0D,0x7B,0x0A,0x80,0x50,0x52,0x51, /* 00000558 "..{..PRQ" */
+ 0x30,0x61,0x70,0x0A,0x09,0x60,0xA4,0x60, /* 00000560 "0ap..`.`" */
+ 0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D, /* 00000568 ".._DIS.}" */
+ 0x50,0x52,0x51,0x30,0x0A,0x80,0x50,0x52, /* 00000570 "PRQ0..PR" */
+ 0x51,0x30,0x14,0x3F,0x5F,0x43,0x52,0x53, /* 00000578 "Q0.?_CRS" */
+ 0x00,0x08,0x50,0x52,0x52,0x30,0x11,0x09, /* 00000580 "..PRR0.." */
+ 0x0A,0x06,0x23,0x02,0x00,0x18,0x79,0x00, /* 00000588 "..#...y." */
+ 0x8B,0x50,0x52,0x52,0x30,0x01,0x54,0x4D, /* 00000590 ".PRR0.TM" */
+ 0x50,0x5F,0x70,0x50,0x52,0x51,0x30,0x60, /* 00000598 "P_pPRQ0`" */
+ 0xA0,0x0C,0x95,0x60,0x0A,0x80,0x79,0x01, /* 000005A0 "...`..y." */
+ 0x60,0x54,0x4D,0x50,0x5F,0xA1,0x07,0x70, /* 000005A8 "`TMP_..p" */
+ 0x00,0x54,0x4D,0x50,0x5F,0xA4,0x50,0x52, /* 000005B0 ".TMP_.PR" */
+ 0x52,0x30,0x14,0x1B,0x5F,0x53,0x52,0x53, /* 000005B8 "R0.._SRS" */
+ 0x01,0x8B,0x68,0x01,0x54,0x4D,0x50,0x5F, /* 000005C0 "..h.TMP_" */
+ 0x82,0x54,0x4D,0x50,0x5F,0x60,0x76,0x60, /* 000005C8 ".TMP_`v`" */
+ 0x70,0x60,0x50,0x52,0x51,0x30,0x5B,0x82, /* 000005D0 "p`PRQ0[." */
+ 0x4F,0x0A,0x4C,0x4E,0x4B,0x42,0x08,0x5F, /* 000005D8 "O.LNKB._" */
+ 0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F, /* 000005E0 "HID.A..." */
+ 0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,0x08, /* 000005E8 "._UID..." */
+ 0x5F,0x50,0x52,0x53,0x11,0x09,0x0A,0x06, /* 000005F0 "_PRS...." */
+ 0x23,0xF8,0x1E,0x18,0x79,0x00,0x14,0x1A, /* 000005F8 "#...y..." */
+ 0x5F,0x53,0x54,0x41,0x00,0x70,0x0A,0x0B, /* 00000600 "_STA.p.." */
+ 0x60,0xA0,0x0D,0x7B,0x0A,0x80,0x50,0x52, /* 00000608 "`..{..PR" */
+ 0x51,0x31,0x61,0x70,0x0A,0x09,0x60,0xA4, /* 00000610 "Q1ap..`." */
+ 0x60,0x14,0x11,0x5F,0x44,0x49,0x53,0x00, /* 00000618 "`.._DIS." */
+ 0x7D,0x50,0x52,0x51,0x31,0x0A,0x80,0x50, /* 00000620 "}PRQ1..P" */
+ 0x52,0x51,0x31,0x14,0x3F,0x5F,0x43,0x52, /* 00000628 "RQ1.?_CR" */
+ 0x53,0x00,0x08,0x50,0x52,0x52,0x30,0x11, /* 00000630 "S..PRR0." */
+ 0x09,0x0A,0x06,0x23,0x02,0x00,0x18,0x79, /* 00000638 "...#...y" */
+ 0x00,0x8B,0x50,0x52,0x52,0x30,0x01,0x54, /* 00000640 "..PRR0.T" */
+ 0x4D,0x50,0x5F,0x70,0x50,0x52,0x51,0x31, /* 00000648 "MP_pPRQ1" */
+ 0x60,0xA0,0x0C,0x95,0x60,0x0A,0x80,0x79, /* 00000650 "`...`..y" */
+ 0x01,0x60,0x54,0x4D,0x50,0x5F,0xA1,0x07, /* 00000658 ".`TMP_.." */
+ 0x70,0x00,0x54,0x4D,0x50,0x5F,0xA4,0x50, /* 00000660 "p.TMP_.P" */
+ 0x52,0x52,0x30,0x14,0x1B,0x5F,0x53,0x52, /* 00000668 "RR0.._SR" */
+ 0x53,0x01,0x8B,0x68,0x01,0x54,0x4D,0x50, /* 00000670 "S..h.TMP" */
+ 0x5F,0x82,0x54,0x4D,0x50,0x5F,0x60,0x76, /* 00000678 "_.TMP_`v" */
+ 0x60,0x70,0x60,0x50,0x52,0x51,0x31,0x5B, /* 00000680 "`p`PRQ1[" */
+ 0x82,0x4F,0x0A,0x4C,0x4E,0x4B,0x43,0x08, /* 00000688 ".O.LNKC." */
+ 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C, /* 00000690 "_HID.A.." */
+ 0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,0x03, /* 00000698 ".._UID.." */
+ 0x08,0x5F,0x50,0x52,0x53,0x11,0x09,0x0A, /* 000006A0 "._PRS..." */
+ 0x06,0x23,0xF8,0x1E,0x18,0x79,0x00,0x14, /* 000006A8 ".#...y.." */
+ 0x1A,0x5F,0x53,0x54,0x41,0x00,0x70,0x0A, /* 000006B0 "._STA.p." */
+ 0x0B,0x60,0xA0,0x0D,0x7B,0x0A,0x80,0x50, /* 000006B8 ".`..{..P" */
+ 0x52,0x51,0x32,0x61,0x70,0x0A,0x09,0x60, /* 000006C0 "RQ2ap..`" */
+ 0xA4,0x60,0x14,0x11,0x5F,0x44,0x49,0x53, /* 000006C8 ".`.._DIS" */
+ 0x00,0x7D,0x50,0x52,0x51,0x32,0x0A,0x80, /* 000006D0 ".}PRQ2.." */
+ 0x50,0x52,0x51,0x32,0x14,0x3F,0x5F,0x43, /* 000006D8 "PRQ2.?_C" */
+ 0x52,0x53,0x00,0x08,0x50,0x52,0x52,0x30, /* 000006E0 "RS..PRR0" */
+ 0x11,0x09,0x0A,0x06,0x23,0x02,0x00,0x18, /* 000006E8 "....#..." */
+ 0x79,0x00,0x8B,0x50,0x52,0x52,0x30,0x01, /* 000006F0 "y..PRR0." */
+ 0x54,0x4D,0x50,0x5F,0x70,0x50,0x52,0x51, /* 000006F8 "TMP_pPRQ" */
+ 0x32,0x60,0xA0,0x0C,0x95,0x60,0x0A,0x80, /* 00000700 "2`...`.." */
+ 0x79,0x01,0x60,0x54,0x4D,0x50,0x5F,0xA1, /* 00000708 "y.`TMP_." */
+ 0x07,0x70,0x00,0x54,0x4D,0x50,0x5F,0xA4, /* 00000710 ".p.TMP_." */
+ 0x50,0x52,0x52,0x30,0x14,0x1B,0x5F,0x53, /* 00000718 "PRR0.._S" */
+ 0x52,0x53,0x01,0x8B,0x68,0x01,0x54,0x4D, /* 00000720 "RS..h.TM" */
+ 0x50,0x5F,0x82,0x54,0x4D,0x50,0x5F,0x60, /* 00000728 "P_.TMP_`" */
+ 0x76,0x60,0x70,0x60,0x50,0x52,0x51,0x32, /* 00000730 "v`p`PRQ2" */
+ 0x5B,0x82,0x4F,0x0A,0x4C,0x4E,0x4B,0x44, /* 00000738 "[.O.LNKD" */
+ 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 00000740 "._HID.A." */
+ 0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A, /* 00000748 "..._UID." */
+ 0x04,0x08,0x5F,0x50,0x52,0x53,0x11,0x09, /* 00000750 ".._PRS.." */
+ 0x0A,0x06,0x23,0xF8,0x1E,0x18,0x79,0x00, /* 00000758 "..#...y." */
+ 0x14,0x1A,0x5F,0x53,0x54,0x41,0x00,0x70, /* 00000760 ".._STA.p" */
+ 0x0A,0x0B,0x60,0xA0,0x0D,0x7B,0x0A,0x80, /* 00000768 "..`..{.." */
+ 0x50,0x52,0x51,0x33,0x61,0x70,0x0A,0x09, /* 00000770 "PRQ3ap.." */
+ 0x60,0xA4,0x60,0x14,0x11,0x5F,0x44,0x49, /* 00000778 "`.`.._DI" */
+ 0x53,0x00,0x7D,0x50,0x52,0x51,0x33,0x0A, /* 00000780 "S.}PRQ3." */
+ 0x80,0x50,0x52,0x51,0x33,0x14,0x3F,0x5F, /* 00000788 ".PRQ3.?_" */
+ 0x43,0x52,0x53,0x00,0x08,0x50,0x52,0x52, /* 00000790 "CRS..PRR" */
+ 0x30,0x11,0x09,0x0A,0x06,0x23,0x02,0x00, /* 00000798 "0....#.." */
+ 0x18,0x79,0x00,0x8B,0x50,0x52,0x52,0x30, /* 000007A0 ".y..PRR0" */
+ 0x01,0x54,0x4D,0x50,0x5F,0x70,0x50,0x52, /* 000007A8 ".TMP_pPR" */
+ 0x51,0x33,0x60,0xA0,0x0C,0x95,0x60,0x0A, /* 000007B0 "Q3`...`." */
+ 0x80,0x79,0x01,0x60,0x54,0x4D,0x50,0x5F, /* 000007B8 ".y.`TMP_" */
+ 0xA1,0x07,0x70,0x00,0x54,0x4D,0x50,0x5F, /* 000007C0 "..p.TMP_" */
+ 0xA4,0x50,0x52,0x52,0x30,0x14,0x1B,0x5F, /* 000007C8 ".PRR0.._" */
+ 0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x54, /* 000007D0 "SRS..h.T" */
+ 0x4D,0x50,0x5F,0x82,0x54,0x4D,0x50,0x5F, /* 000007D8 "MP_.TMP_" */
+ 0x60,0x76,0x60,0x70,0x60,0x50,0x52,0x51, /* 000007E0 "`v`p`PRQ" */
+ 0x33,0x08,0x5F,0x53,0x33,0x5F,0x12,0x06, /* 000007E8 "3._S3_.." */
+ 0x04,0x01,0x01,0x00,0x00,0x08,0x5F,0x53, /* 000007F0 "......_S" */
+ 0x34,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007F8 "4_......" */
+ 0x00,0x08,0x5F,0x53,0x35,0x5F,0x12,0x06, /* 00000800 ".._S5_.." */
+ 0x04,0x00,0x00,0x00,0x00,
};
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS.
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
@ 2008-11-16 10:50 ` Blue Swirl
2008-11-16 11:01 ` Gleb Natapov
0 siblings, 1 reply; 20+ messages in thread
From: Blue Swirl @ 2008-11-16 10:50 UTC (permalink / raw)
To: qemu-devel, Gleb Natapov; +Cc: bochs-developers
On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> +void s3_resume_panic()
How about rather:
void s3_resume_panic(void)
> +int
> +s3_resume()
s3_resume(void)?
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS.
2008-11-16 10:50 ` Blue Swirl
@ 2008-11-16 11:01 ` Gleb Natapov
2008-11-16 11:11 ` Blue Swirl
2008-11-16 17:54 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. " Sebastian Herbszt
0 siblings, 2 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 11:01 UTC (permalink / raw)
To: Blue Swirl; +Cc: bochs-developers, qemu-devel
On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
> On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> > +void s3_resume_panic()
>
> How about rather:
> void s3_resume_panic(void)
>
> > +int
> > +s3_resume()
>
> s3_resume(void)?
Have you tried it? :)
Hint: bcc doesn't support ANSI-C.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS.
2008-11-16 11:01 ` Gleb Natapov
@ 2008-11-16 11:11 ` Blue Swirl
2008-11-16 11:15 ` Gleb Natapov
2008-11-16 17:54 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. " Sebastian Herbszt
1 sibling, 1 reply; 20+ messages in thread
From: Blue Swirl @ 2008-11-16 11:11 UTC (permalink / raw)
To: Gleb Natapov; +Cc: bochs-developers, qemu-devel
On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
> > On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> > > +void s3_resume_panic()
> >
> > How about rather:
> > void s3_resume_panic(void)
> >
> > > +int
> > > +s3_resume()
> >
> > s3_resume(void)?
>
>
> Have you tried it? :)
>
> Hint: bcc doesn't support ANSI-C.
Oh, no.
Doesn't Linux use gcc even for 16 bit code these days? Why can't bochs
do the same?
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS.
2008-11-16 11:11 ` Blue Swirl
@ 2008-11-16 11:15 ` Gleb Natapov
0 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 11:15 UTC (permalink / raw)
To: Blue Swirl; +Cc: bochs-developers, qemu-devel
On Sun, Nov 16, 2008 at 01:11:21PM +0200, Blue Swirl wrote:
> On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> > On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
> > > On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
> > > > +void s3_resume_panic()
> > >
> > > How about rather:
> > > void s3_resume_panic(void)
> > >
> > > > +int
> > > > +s3_resume()
> > >
> > > s3_resume(void)?
> >
> >
> > Have you tried it? :)
> >
> > Hint: bcc doesn't support ANSI-C.
>
> Oh, no.
>
> Doesn't Linux use gcc even for 16 bit code these days? Why can't bochs
> do the same?
There is a project to do just that + rewrite entire BIOS to be C (mostly).
http://www.coreboot.org/SeaBIOS. Sometime Qemu should move to it.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
` (4 preceding siblings ...)
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 5/5] Don't power down vga card on entering S3 state Gleb Natapov
@ 2008-11-16 17:35 ` Sebastian Herbszt
2008-11-16 17:38 ` Gleb Natapov
5 siblings, 1 reply; 20+ messages in thread
From: Sebastian Herbszt @ 2008-11-16 17:35 UTC (permalink / raw)
To: Gleb Natapov, bochs-developers; +Cc: qemu-devel
Gleb Natapov wrote:
> v4:
> - If resume vector is NULL return to normal POST
Gleb,
did only "[PATCH v4 1/5] Add S3 state to DSDT. Handleresume event in the BIOS."
change since v3?
- Sebastian
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS
2008-11-16 17:35 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS Sebastian Herbszt
@ 2008-11-16 17:38 ` Gleb Natapov
0 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 17:38 UTC (permalink / raw)
To: Sebastian Herbszt; +Cc: bochs-developers, qemu-devel
On Sun, Nov 16, 2008 at 06:35:03PM +0100, Sebastian Herbszt wrote:
> Gleb Natapov wrote:
>> v4:
>> - If resume vector is NULL return to normal POST
>
> Gleb,
>
> did only "[PATCH v4 1/5] Add S3 state to DSDT. Handleresume event in the BIOS."
> change since v3?
>
Yes.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. Handle resume event in the BIOS.
2008-11-16 11:01 ` Gleb Natapov
2008-11-16 11:11 ` Blue Swirl
@ 2008-11-16 17:54 ` Sebastian Herbszt
2008-11-16 18:01 ` Gleb Natapov
1 sibling, 1 reply; 20+ messages in thread
From: Sebastian Herbszt @ 2008-11-16 17:54 UTC (permalink / raw)
To: Gleb Natapov, Blue Swirl; +Cc: bochs-developers, qemu-devel
Gleb Natapov wrote:
> On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
>> On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
>> > +void s3_resume_panic()
>>
>> How about rather:
>> void s3_resume_panic(void)
>>
>> > +int
>> > +s3_resume()
>>
>> s3_resume(void)?
>
> Have you tried it? :)
>
> Hint: bcc doesn't support ANSI-C.
It accepts some ansi-c with "-ansi". Man page says
"-ansi Pass the C source through unprotoize after preprocessing and
before code generation. This will allow some ansi C to be compiled but
it is definitly NOT a true ansi-C compiler."
- Sebastian
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. Handle resume event in the BIOS.
2008-11-16 17:54 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. " Sebastian Herbszt
@ 2008-11-16 18:01 ` Gleb Natapov
2008-11-17 23:07 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 statetoDSDT. " Sebastian Herbszt
0 siblings, 1 reply; 20+ messages in thread
From: Gleb Natapov @ 2008-11-16 18:01 UTC (permalink / raw)
To: Sebastian Herbszt; +Cc: Blue Swirl, bochs-developers, qemu-devel
On Sun, Nov 16, 2008 at 06:54:38PM +0100, Sebastian Herbszt wrote:
> Gleb Natapov wrote:
>> On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
>>> On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
>>> > +void s3_resume_panic()
>>>
>>> How about rather:
>>> void s3_resume_panic(void)
>>>
>>> > +int
>>> > +s3_resume()
>>>
>>> s3_resume(void)?
>>
>> Have you tried it? :)
>>
>> Hint: bcc doesn't support ANSI-C.
>
> It accepts some ansi-c with "-ansi". Man page says
> "-ansi Pass the C source through unprotoize after preprocessing and
> before code generation. This will allow some ansi C to be compiled but
> it is definitly NOT a true ansi-C compiler."
>
But BOCHS doesn't use this flag. Do you what to add it and fix all
function prototypes? Seems like to much work for a little gain.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 statetoDSDT. Handle resume event in the BIOS.
2008-11-16 18:01 ` Gleb Natapov
@ 2008-11-17 23:07 ` Sebastian Herbszt
0 siblings, 0 replies; 20+ messages in thread
From: Sebastian Herbszt @ 2008-11-17 23:07 UTC (permalink / raw)
To: Gleb Natapov; +Cc: Blue Swirl, bochs-developers, qemu-devel
Gleb Natapov wrote:
> On Sun, Nov 16, 2008 at 06:54:38PM +0100, Sebastian Herbszt wrote:
>> Gleb Natapov wrote:
>>> On Sun, Nov 16, 2008 at 12:50:55PM +0200, Blue Swirl wrote:
>>>> On 11/16/08, Gleb Natapov <gleb@redhat.com> wrote:
>>>> > +void s3_resume_panic()
>>>>
>>>> How about rather:
>>>> void s3_resume_panic(void)
>>>>
>>>> > +int
>>>> > +s3_resume()
>>>>
>>>> s3_resume(void)?
>>>
>>> Have you tried it? :)
>>>
>>> Hint: bcc doesn't support ANSI-C.
>>
>> It accepts some ansi-c with "-ansi". Man page says
>> "-ansi Pass the C source through unprotoize after preprocessing and
>> before code generation. This will allow some ansi C to be compiled but
>> it is definitly NOT a true ansi-C compiler."
>>
> But BOCHS doesn't use this flag. Do you what to add it and fix all
> function prototypes? Seems like to much work for a little gain.
No, i currently don't plan to change this.
- Sebastian
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init.
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 2/5] Preserve memory content during SMM init Gleb Natapov
@ 2008-11-17 23:51 ` Sebastian Herbszt
2008-11-18 7:46 ` Gleb Natapov
0 siblings, 1 reply; 20+ messages in thread
From: Sebastian Herbszt @ 2008-11-17 23:51 UTC (permalink / raw)
To: Gleb Natapov, bochs-developers; +Cc: qemu-devel
Gleb Natapov wrote:
> Signed-off-by: Gleb Natapov <gleb@redhat.com>
> ---
>
> bios/rombios32.c | 10 ++++++++--
> 1 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/bios/rombios32.c b/bios/rombios32.c
> index 7b354a8..7075aa9 100644
> --- a/bios/rombios32.c
> +++ b/bios/rombios32.c
> @@ -731,6 +731,12 @@ static void smm_init(PCIDevice *d)
> value = pci_config_readl(d, 0x58);
> if ((value & (1 << 25)) == 0) {
>
> + /* enable the SMM memory window */
> + pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x48);
> +
> + /* save original memory content */
> + memcpy((void *)0xa8000, (void *)0x38000, 0x8000);
> +
> /* copy the SMM relocation code */
> memcpy((void *)0x38000, &smm_relocation_start,
> &smm_relocation_end - &smm_relocation_start);
> @@ -747,8 +753,8 @@ static void smm_init(PCIDevice *d)
> /* wait until SMM code executed */
> while (inb(0xb3) != 0x00);
>
> - /* enable the SMM memory window */
> - pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x48);
> + /* restore original memory content */
> + memcpy((void *)0x38000, (void *)0xa8000, 0x8000);
>
> /* copy the SMM code */
> memcpy((void *)0xa8000, &smm_code_start,
Gleb,
can you please explain why this is needed?
smm_init() is currently only run on VM start and overwriting
memory is not an issue there. This would matter on S3 resume,
but smm_init() is not run there. It is only run from pci_bios_init(),
but on S3 resume we bail out from rombios32.c before this call.
Your patch to handle S3 in qemu does use qemu_system_reset_request()
which does reset some emulated devices. Since piix4_pm does not
register a reset handler it is not reset. I assume the reset on S3 resume
is a hardware reset and the state of piix4_pm should be reset too, right?
cpu_reset() in target-i386/helper.c does set smbase to 0x30000. Since the
piix4_pm state is not lost, APMC_EN is still set and even on a normal reset
SMBASE is not relocated. If i don't mistake smm_init() should be run on S3
resume and we would need something like
pci_for_each_device(find_piix4pm)
if (piix4pm_pcidev)
smm_init();
in the resume path in rombios32.c.
- Sebastian
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init.
2008-11-17 23:51 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init Sebastian Herbszt
@ 2008-11-18 7:46 ` Gleb Natapov
2008-11-18 8:27 ` Gleb Natapov
0 siblings, 1 reply; 20+ messages in thread
From: Gleb Natapov @ 2008-11-18 7:46 UTC (permalink / raw)
To: Sebastian Herbszt; +Cc: bochs-developers, qemu-devel
On Tue, Nov 18, 2008 at 12:51:17AM +0100, Sebastian Herbszt wrote:
> smm_init() is currently only run on VM start and overwriting
> memory is not an issue there. This would matter on S3 resume,
> but smm_init() is not run there. It is only run from pci_bios_init(),
> but on S3 resume we bail out from rombios32.c before this call.
> Your patch to handle S3 in qemu does use qemu_system_reset_request()
> which does reset some emulated devices. Since piix4_pm does not
> register a reset handler it is not reset. I assume the reset on S3 resume
> is a hardware reset and the state of piix4_pm should be reset too, right?
S3 removes power from all devices except memory, so yes, piix4_pm should
be reset to its power up state.
> cpu_reset() in target-i386/helper.c does set smbase to 0x30000. Since the
> piix4_pm state is not lost, APMC_EN is still set and even on a normal reset
> SMBASE is not relocated. If i don't mistake smm_init() should be run on S3
> resume and we would need something like
>
> pci_for_each_device(find_piix4pm)
> if (piix4pm_pcidev)
> smm_init();
>
> in the resume path in rombios32.c.
>
Yes, you are right. I'll add it.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init.
2008-11-18 7:46 ` Gleb Natapov
@ 2008-11-18 8:27 ` Gleb Natapov
2008-11-23 21:15 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory contentduringSMM init Sebastian Herbszt
0 siblings, 1 reply; 20+ messages in thread
From: Gleb Natapov @ 2008-11-18 8:27 UTC (permalink / raw)
To: Sebastian Herbszt; +Cc: bochs-developers, qemu-devel
On Tue, Nov 18, 2008 at 09:46:28AM +0200, Gleb Natapov wrote:
> > SMBASE is not relocated. If i don't mistake smm_init() should be run on S3
> > resume and we would need something like
> >
> > pci_for_each_device(find_piix4pm)
> > if (piix4pm_pcidev)
> > smm_init();
> >
> > in the resume path in rombios32.c.
> >
> Yes, you are right. I'll add it.
>
What about this? (fixed version of 1/5 patch)
diff --git a/bios/acpi-dsdt.dsl b/bios/acpi-dsdt.dsl
index 19ac2f9..280a05e 100644
--- a/bios/acpi-dsdt.dsl
+++ b/bios/acpi-dsdt.dsl
@@ -531,11 +531,29 @@ DefinitionBlock (
}
}
- /* S5 = power off state */
- Name (_S5, Package (4) {
- 0x00, // PM1a_CNT.SLP_TYP
- 0x00, // PM2a_CNT.SLP_TYP
- 0x00, // reserved
- 0x00, // reserved
+ /*
+ * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off) type codes:
+ * must match piix4 emulation.
+ */
+ Name (\_S3, Package (0x04)
+ {
+ 0x01, /* PM1a_CNT.SLP_TYP */
+ 0x01, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
+ })
+ Name (\_S4, Package (0x04)
+ {
+ Zero, /* PM1a_CNT.SLP_TYP */
+ Zero, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
+ })
+ Name (\_S5, Package (0x04)
+ {
+ Zero, /* PM1a_CNT.SLP_TYP */
+ Zero, /* PM1b_CNT.SLP_TYP */
+ Zero, /* reserved */
+ Zero /* reserved */
})
}
diff --git a/bios/acpi-dsdt.hex b/bios/acpi-dsdt.hex
index 6bc6268..6088b18 100644
--- a/bios/acpi-dsdt.hex
+++ b/bios/acpi-dsdt.hex
@@ -1,22 +1,22 @@
/*
*
* Intel ACPI Component Architecture
- * ASL Optimizing Compiler version 20060912 [Nov 25 2006]
+ * ASL Optimizing Compiler version 20061109 [May 15 2007]
* Copyright (C) 2000 - 2006 Intel Corporation
* Supports ACPI Specification Revision 3.0a
*
- * Compilation of "acpi-dsdt.dsl" - Sun Sep 14 10:27:40 2008
+ * Compilation of "acpi-dsdt.dsl" - Mon Oct 27 10:37:05 2008
*
* C source code output
*
*/
-unsigned char AmlCode[] =
+const unsigned char AmlCode[] =
{
- 0x44,0x53,0x44,0x54,0xC9,0x07,0x00,0x00, /* 00000000 "DSDT...." */
- 0x01,0x0E,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 "..BXPC.." */
+ 0x44,0x53,0x44,0x54,0xE1,0x07,0x00,0x00, /* 00000000 "DSDT...." */
+ 0x01,0x24,0x42,0x58,0x50,0x43,0x00,0x00, /* 00000008 ".$BXPC.." */
0x42,0x58,0x44,0x53,0x44,0x54,0x00,0x00, /* 00000010 "BXDSDT.." */
0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
- 0x12,0x09,0x06,0x20,0x10,0x1C,0x5C,0x00, /* 00000020 "... ..\." */
+ 0x09,0x11,0x06,0x20,0x10,0x1C,0x5C,0x00, /* 00000020 "... ..\." */
0x5B,0x80,0x44,0x42,0x47,0x5F,0x01,0x0B, /* 00000028 "[.DBG_.." */
0x44,0xB0,0x0A,0x04,0x5B,0x81,0x0B,0x44, /* 00000030 "D...[..D" */
0x42,0x47,0x5F,0x03,0x44,0x42,0x47,0x4C, /* 00000038 "BG_.DBGL" */
@@ -260,6 +260,9 @@ unsigned char AmlCode[] =
0x8B,0x68,0x01,0x54,0x4D,0x50,0x5F,0x82, /* 000007A8 ".h.TMP_." */
0x54,0x4D,0x50,0x5F,0x60,0x76,0x60,0x70, /* 000007B0 "TMP_`v`p" */
0x60,0x50,0x52,0x51,0x33,0x08,0x5F,0x53, /* 000007B8 "`PRQ3._S" */
- 0x35,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007C0 "5_......" */
+ 0x33,0x5F,0x12,0x06,0x04,0x01,0x01,0x00, /* 000007C0 "3_......" */
+ 0x00,0x08,0x5F,0x53,0x34,0x5F,0x12,0x06, /* 000007C8 ".._S4_.." */
+ 0x04,0x00,0x00,0x00,0x00,0x08,0x5F,0x53, /* 000007D0 "......_S" */
+ 0x35,0x5F,0x12,0x06,0x04,0x00,0x00,0x00, /* 000007D8 "5_......" */
0x00,
};
diff --git a/bios/rombios.c b/bios/rombios.c
index 9255b89..a34c6b2 100644
--- a/bios/rombios.c
+++ b/bios/rombios.c
@@ -1917,6 +1917,11 @@ shutdown_status_panic(status)
BX_PANIC("Unimplemented shutdown status: %02x\n",(Bit8u)status);
}
+void s3_resume_panic()
+{
+ BX_PANIC("Returned from s3_resume.\n");
+}
+
//--------------------------------------------------------------------------
// print_bios_banner
// displays a the bios version
@@ -2198,6 +2203,33 @@ debugger_off()
outb(0xfedc, 0x00);
}
+int
+s3_resume()
+{
+ Bit32u s3_wakeup_vector;
+ Bit8u s3_resume_flag;
+
+ s3_resume_flag = read_byte(0x40, 0xb0);
+ s3_wakeup_vector = read_dword(0x40, 0xb2);
+
+ BX_INFO("S3 resume called %x 0x%lx\n", s3_resume_flag, s3_wakeup_vector);
+ if (s3_resume_flag != 0xFE || !s3_wakeup_vector)
+ return 0;
+
+ write_byte(0x40, 0xb0, 0);
+
+ /* setup wakeup vector */
+ write_word(0x40, 0xb6, (s3_wakeup_vector & 0xF)); /* IP */
+ write_word(0x40, 0xb8, (s3_wakeup_vector >> 4)); /* CS */
+
+ BX_INFO("S3 resume jump to %x:%x\n", (s3_wakeup_vector >> 4),
+ (s3_wakeup_vector & 0xF));
+ASM_START
+ jmpf [0x04b6]
+ASM_END
+ return 1;
+}
+
#if BX_USE_ATADRV
// ---------------------------------------------------------------------------
@@ -9081,6 +9113,15 @@ retf_post_0x467:
mov ss, [0x469]
retf
+s3_post:
+#if BX_ROMBIOS32
+ call rombios32_init
+#endif
+ call _s3_resume
+ mov bl, #0x00
+ and ax, ax
+ jz normal_post
+ call _s3_resume_panic
;--------------------
eoi_both_pics:
@@ -10005,6 +10046,10 @@ rombios32_05:
;; init the stack pointer
mov esp, #0x00080000
+ ;; pass pointer to s3_resume_flag and s3_resume_vector to rombios32
+ push #0x04b0
+ push #0x04b2
+
;; call rombios32 code
mov eax, #0x00040000
call eax
@@ -10375,6 +10420,12 @@ normal_post:
mov ds, ax
mov ss, ax
+ ;; Save shutdown status
+ mov 0x04b0, bl
+
+ cmp bl, #0xfe
+ jz s3_post
+
;; zero out BIOS data area (40:00..40:ff)
mov es, ax
mov cx, #0x0080 ;; 128 words
diff --git a/bios/rombios32.c b/bios/rombios32.c
index 38cfe06..dfb7c88 100644
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -180,6 +180,20 @@ void *memmove(void *d1, const void *s1, size_t len)
return d1;
}
+int memcmp(const void *s1, const void *s2, size_t len)
+{
+ const int8_t *p1 = s1;
+ const int8_t *p2 = s2;
+
+ while (len--) {
+ int r = *p1++ - *p2++;
+ if(r)
+ return r;
+ }
+
+ return 0;
+}
+
size_t strlen(const char *s)
{
const char *s1;
@@ -625,7 +639,7 @@ static int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
return (irq_num + slot_addend) & 3;
}
-static int find_bios_table_area(void)
+static void find_bios_table_area(void)
{
unsigned long addr;
for(addr = 0xf0000; addr < 0x100000; addr += 16) {
@@ -634,17 +648,17 @@ static int find_bios_table_area(void)
bios_table_end_addr = bios_table_cur_addr + *(uint32_t *)(addr + 4);
BX_INFO("bios_table_addr: 0x%08lx end=0x%08lx\n",
bios_table_cur_addr, bios_table_end_addr);
- return 0;
+ return;
}
}
- return -1;
+ return;
}
static void bios_shadow_init(PCIDevice *d)
{
int v;
- if (find_bios_table_area() < 0)
+ if (bios_table_cur_addr == 0)
return;
/* remap the BIOS to shadow RAM an keep it read/write while we
@@ -747,6 +761,18 @@ static void smm_init(PCIDevice *d)
}
#endif
+static void piix4_pm_enable(PCIDevice *d)
+{
+ /* PIIX4 Power Management device (for ACPI) */
+ pci_config_writel(d, 0x40, PM_IO_BASE | 1);
+ pci_config_writeb(d, 0x80, 0x01); /* enable PM io space */
+ pci_config_writel(d, 0x90, SMB_IO_BASE | 1);
+ pci_config_writeb(d, 0xd2, 0x09); /* enable SMBus io space */
+#ifdef BX_USE_SMM
+ smm_init(d);
+#endif
+}
+
static void pci_bios_init_device(PCIDevice *d)
{
int class;
@@ -837,15 +863,9 @@ static void pci_bios_init_device(PCIDevice *d)
if (vendor_id == PCI_VENDOR_ID_INTEL && device_id == PCI_DEVICE_ID_INTEL_82371AB_3) {
/* PIIX4 Power Management device (for ACPI) */
pm_io_base = PM_IO_BASE;
- pci_config_writel(d, 0x40, pm_io_base | 1);
- pci_config_writeb(d, 0x80, 0x01); /* enable PM io space */
smb_io_base = SMB_IO_BASE;
- pci_config_writel(d, 0x90, smb_io_base | 1);
- pci_config_writeb(d, 0xd2, 0x09); /* enable SMBus io space */
pm_sci_int = pci_config_readb(d, PCI_INTERRUPT_LINE);
-#ifdef BX_USE_SMM
- smm_init(d);
-#endif
+ piix4_pm_enable(d);
acpi_enabled = 1;
}
}
@@ -1460,6 +1480,7 @@ void acpi_bios_init(void)
memset(facs, 0, sizeof(*facs));
memcpy(facs->signature, "FACS", 4);
facs->length = cpu_to_le32(sizeof(*facs));
+ BX_INFO("Firmware waking vector %p\n", &facs->firmware_waking_vector);
/* DSDT */
memcpy(dsdt, AmlCode, sizeof(AmlCode));
@@ -2010,9 +2031,59 @@ void smbios_init(void)
BX_INFO("SMBIOS table addr=0x%08lx\n", (unsigned long)start);
}
-void rombios32_init(void)
+static uint32_t find_resume_vector(void)
+{
+ unsigned long addr, start, end;
+
+#ifdef BX_USE_EBDA_TABLES
+ start = align(ebda_cur_addr, 16);
+ end = 0xa000 << 4;
+#else
+ if (bios_table_cur_addr == 0)
+ return 0;
+ start = align(bios_table_cur_addr, 16);
+ end = bios_table_end_addr;
+#endif
+
+ for (addr = start; addr < end; addr += 16) {
+ if (!memcmp((void*)addr, "RSD PTR ", 8)) {
+ struct rsdp_descriptor *rsdp = (void*)addr;
+ struct rsdt_descriptor_rev1 *rsdt = (void*)rsdp->rsdt_physical_address;
+ struct fadt_descriptor_rev1 *fadt = (void*)rsdt->table_offset_entry[0];
+ struct facs_descriptor_rev1 *facs = (void*)fadt->firmware_ctrl;
+ return facs->firmware_waking_vector;
+ }
+ }
+
+ return 0;
+}
+
+static void find_440fx(PCIDevice *d)
+{
+ uint16_t vendor_id, device_id;
+
+ vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
+ device_id = pci_config_readw(d, PCI_DEVICE_ID);
+
+ if (vendor_id == PCI_VENDOR_ID_INTEL && device_id == PCI_DEVICE_ID_INTEL_82441)
+ i440_pcidev = *d;
+}
+
+static void reinit_piix4_pm(PCIDevice *d)
+{
+ uint16_t vendor_id, device_id;
+
+ vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
+ device_id = pci_config_readw(d, PCI_DEVICE_ID);
+
+ if (vendor_id == PCI_VENDOR_ID_INTEL && device_id == PCI_DEVICE_ID_INTEL_82371AB_3)
+ piix4_pm_enable(d);
+}
+
+void rombios32_init(uint32_t *s3_resume_vector, uint8_t *shutdown_flag)
{
BX_INFO("Starting rombios32\n");
+ BX_INFO("Shutdown flag %x\n", *shutdown_flag);
#ifdef BX_QEMU
qemu_cfg_port = qemu_cfg_port_probe();
@@ -2024,6 +2095,22 @@ void rombios32_init(void)
smp_probe();
+ find_bios_table_area();
+
+ if (*shutdown_flag == 0xfe) {
+ *s3_resume_vector = find_resume_vector();
+ if (!*s3_resume_vector) {
+ BX_INFO("This is S3 resume but wakeup vector is NULL\n");
+ } else {
+ BX_INFO("S3 resume vector %p\n", *s3_resume_vector);
+ /* redirect bios read access to RAM */
+ pci_for_each_device(find_440fx);
+ bios_lock_shadow_ram(); /* bios is already copied */
+ pci_for_each_device(reinit_piix4_pm);
+ }
+ return;
+ }
+
pci_bios_init();
if (bios_table_cur_addr != 0) {
--
Gleb.
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory contentduringSMM init.
2008-11-18 8:27 ` Gleb Natapov
@ 2008-11-23 21:15 ` Sebastian Herbszt
2008-11-24 7:35 ` Gleb Natapov
0 siblings, 1 reply; 20+ messages in thread
From: Sebastian Herbszt @ 2008-11-23 21:15 UTC (permalink / raw)
To: Gleb Natapov; +Cc: bochs-developers, qemu-devel
Gleb Natapov wrote:
> On Tue, Nov 18, 2008 at 09:46:28AM +0200, Gleb Natapov wrote:
>> > SMBASE is not relocated. If i don't mistake smm_init() should be run on S3
>> > resume and we would need something like
>> >
>> > pci_for_each_device(find_piix4pm)
>> > if (piix4pm_pcidev)
>> > smm_init();
>> >
>> > in the resume path in rombios32.c.
>> >
>> Yes, you are right. I'll add it.
>>
> What about this? (fixed version of 1/5 patch)
Looks good.
Do you intend to implement piix4_pm_reset() for qemu so register DEVACTB
is reset on qemu_system_reset_request()?
- Sebastian
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory contentduringSMM init.
2008-11-23 21:15 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory contentduringSMM init Sebastian Herbszt
@ 2008-11-24 7:35 ` Gleb Natapov
0 siblings, 0 replies; 20+ messages in thread
From: Gleb Natapov @ 2008-11-24 7:35 UTC (permalink / raw)
To: Sebastian Herbszt; +Cc: bochs-developers, qemu-devel
On Sun, Nov 23, 2008 at 10:15:36PM +0100, Sebastian Herbszt wrote:
> Gleb Natapov wrote:
>> On Tue, Nov 18, 2008 at 09:46:28AM +0200, Gleb Natapov wrote:
>>> > SMBASE is not relocated. If i don't mistake smm_init() should be run on S3
>>> > resume and we would need something like
>>> >
>>> > pci_for_each_device(find_piix4pm)
>>> > if (piix4pm_pcidev)
>>> > smm_init();
>>> >
>>> > in the resume path in rombios32.c.
>>> >
>>> Yes, you are right. I'll add it.
>>>
>> What about this? (fixed version of 1/5 patch)
>
> Looks good.
> Do you intend to implement piix4_pm_reset() for qemu so register DEVACTB
> is reset on qemu_system_reset_request()?
>
Sure, why not.
--
Gleb.
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2008-11-24 7:35 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-16 9:33 [Qemu-devel] [PATCH v4 0/5] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 1/5] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
2008-11-16 10:50 ` Blue Swirl
2008-11-16 11:01 ` Gleb Natapov
2008-11-16 11:11 ` Blue Swirl
2008-11-16 11:15 ` Gleb Natapov
2008-11-16 17:54 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 state toDSDT. " Sebastian Herbszt
2008-11-16 18:01 ` Gleb Natapov
2008-11-17 23:07 ` [Bochs-developers] [Qemu-devel] [PATCH v4 1/5] Add S3 statetoDSDT. " Sebastian Herbszt
2008-11-16 9:33 ` [Qemu-devel] [PATCH v4 2/5] Preserve memory content during SMM init Gleb Natapov
2008-11-17 23:51 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory content duringSMM init Sebastian Herbszt
2008-11-18 7:46 ` Gleb Natapov
2008-11-18 8:27 ` Gleb Natapov
2008-11-23 21:15 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 2/5] Preserve memory contentduringSMM init Sebastian Herbszt
2008-11-24 7:35 ` Gleb Natapov
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 3/5] Execute rombios32 code from rom address 0xe0000 Gleb Natapov
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 4/5] Don't use unreserved memory in BIOS Gleb Natapov
2008-11-16 9:34 ` [Qemu-devel] [PATCH v4 5/5] Don't power down vga card on entering S3 state Gleb Natapov
2008-11-16 17:35 ` [Qemu-devel] Re: [Bochs-developers] [PATCH v4 0/5] Support for S3 ACPI state(suspend to memory) in BIOS Sebastian Herbszt
2008-11-16 17:38 ` Gleb Natapov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).