From: "Sebastian Herbszt" <herbszt@gmx.de>
To: Gleb Natapov <gleb@redhat.com>, bochs-developers@lists.sourceforge.net
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [Bochs-developers] [PATCH 2/6] Add S3 state to DSDT. Handle resumeevent in the BIOS.
Date: Thu, 30 Oct 2008 23:41:28 +0100 [thread overview]
Message-ID: <D2320D98C2C74774AD7F785CB3035DAB@FSCPC> (raw)
In-Reply-To: <20081027101259.21464.36016.stgit@gleb-debian.qumranet.com.qumranet.com>
Gleb Natapov wrote:
> diff --git a/bios/rombios.c b/bios/rombios.c
> index 88eac04..46996fa 100644
> --- a/bios/rombios.c
> +++ b/bios/rombios.c
> @@ -2198,6 +2198,31 @@ debugger_off()
> outb(0xfedc, 0x00);
> }
>
> +void
> +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;
> +
> + 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 */
Any reason not to use 0040h:0067h instead?
> + BX_INFO("S3 resume jump to %x:%x\n", *(Bit16u*)0x04b8, *(Bit16u*)0x04b6);
> +ASM_START
> + jmpf [0x04b6]
> +ASM_END
> +}
> +
> #if BX_USE_ATADRV
>
> // ---------------------------------------------------------------------------
> @@ -10005,6 +10030,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
> @@ -10383,6 +10412,9 @@ normal_post:
> rep
> stosw
>
> + ;; Save shutdown status
> + mov 0x04b0, bl
> +
> call _log_bios_start
>
> ;; set all interrupts to default handler
> @@ -10593,6 +10625,8 @@ post_default_ints:
> mov ax, #0xe000
> call rom_scan
>
> + call _s3_resume
> +
> #if BX_ELTORITO_BOOT
> call _interactive_bootkey
> #endif // BX_ELTORITO_BOOT
> diff --git a/bios/rombios32.c b/bios/rombios32.c
> index f0daf15..ff84f80 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;
> @@ -644,7 +658,7 @@ 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
> @@ -1461,7 +1475,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));
>
> @@ -2011,9 +2025,40 @@ 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)
> {
> - BX_INFO("Starting rombios32\n");
> + unsigned long addr;
> +
> + if (bios_table_cur_addr == 0)
> + return 0;
BX_USE_EBDA_TABLES case
> +
> + for (addr = bios_table_cur_addr; addr < bios_table_end_addr; addr++) {
> + 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;
> + }
> + }
> +
RSDP is on a 16-byte boundary
> + 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 == 0x8086 && device_id == 0x1237)
> + i440_pcidev = *d;
Please use PCI_VENDOR_ID_INTEL and PCI_DEVICE_ID_INTEL_82441.
> +}
> +
> +void rombios32_init(uint32_t *s3_resume_vector, uint8_t *shutdown_flag)
> +{
> + BX_INFO("Starting rombios32 %p %p %x\n", s3_resume_vector, shutdown_flag, *shutdown_flag);
Maybe make it two lines and explain the values for the log:
BX_INFO("Starting rombios32\n");
BX_INFO("s3_resume_vector=%p ... \n", s3_resume_vector, ...
>
> #ifdef BX_QEMU
> qemu_cfg_port = qemu_cfg_port_probe();
> @@ -2025,6 +2070,24 @@ void rombios32_init(void)
>
> smp_probe();
>
> + if (find_bios_table_area() < 0)
> + return;
It should not return if BX_USE_EBDA_TABLES is defined.
Is there a need to return at all?
> +
> + 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 */
bios_shadow_init() is called in pci_bios_init(). Why do we need to lock it here?
> + return;
> + }
> + }
> +
> + uuid_probe();
> +
> pci_bios_init();
>
> if (bios_table_cur_addr != 0) {
>
rombios32.c r1.32 got:
smp_probe();
pci_bios_init();
if (bios_table_cur_addr != 0) {
mptable_init();
uuid_probe();
The patch should remove uuid_probe() from the if-case.
- Sebastian
next prev parent reply other threads:[~2008-10-30 22:42 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-27 10:12 [Qemu-devel] [PATCH 0/6] Support for S3 ACPI state (suspend to memory) in BIOS Gleb Natapov
2008-10-27 10:12 ` [Qemu-devel] [PATCH 1/6] Move PIC initialization out of line to save space in post code area Gleb Natapov
2008-10-27 10:13 ` [Qemu-devel] [PATCH 2/6] Add S3 state to DSDT. Handle resume event in the BIOS Gleb Natapov
2008-10-30 22:41 ` Sebastian Herbszt [this message]
2008-11-02 10:04 ` [Qemu-devel] Re: [Bochs-developers] [PATCH 2/6] Add S3 state to DSDT. Handle resumeevent " Gleb Natapov
2008-11-02 18:13 ` [Qemu-devel] Re: [Bochs-developers] [PATCH 2/6] Add S3 state to DSDT. Handleresumeevent " Sebastian Herbszt
2008-11-02 18:39 ` Gleb Natapov
2008-11-02 16:31 ` [Qemu-devel] Re: [Bochs-developers] [PATCH 2/6] Add S3 state to DSDT. Handle resumeevent " Kevin O'Connor
2008-11-02 23:28 ` [Qemu-devel] Re: [Bochs-developers] [PATCH 2/6] Add S3 state to DSDT. Handleresumeevent " Sebastian Herbszt
2008-11-03 0:03 ` Kevin O'Connor
2008-10-27 10:13 ` [Qemu-devel] [PATCH 3/6] Disable init of SMM Gleb Natapov
2008-10-27 10:13 ` [Qemu-devel] [PATCH 4/6] Execute rombios32 code from rom address 0xe0000 Gleb Natapov
2008-10-27 10:13 ` [Qemu-devel] [PATCH 5/6] Don't use unreserved memory in BIOS Gleb Natapov
2008-10-30 23:12 ` [Qemu-devel] Re: [Bochs-developers] " Sebastian Herbszt
2008-11-02 10:06 ` Gleb Natapov
2008-11-02 23:44 ` [Qemu-devel] Re: [Bochs-developers] [PATCH 5/6] Don't use unreserved memory inBIOS Sebastian Herbszt
2008-11-03 6:29 ` Gleb Natapov
2008-10-27 10:13 ` [Qemu-devel] [PATCH 6/6] Don't power down vga card on entering S3 state Gleb Natapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=D2320D98C2C74774AD7F785CB3035DAB@FSCPC \
--to=herbszt@gmx.de \
--cc=bochs-developers@lists.sourceforge.net \
--cc=gleb@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.