From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LZ5Wf-0008R5-Qa for qemu-devel@nongnu.org; Mon, 16 Feb 2009 10:36:53 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LZ5Wd-0008Qg-84 for qemu-devel@nongnu.org; Mon, 16 Feb 2009 10:36:52 -0500 Received: from [199.232.76.173] (port=45162 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LZ5Wc-0008Qa-Vc for qemu-devel@nongnu.org; Mon, 16 Feb 2009 10:36:51 -0500 Received: from e7.ny.us.ibm.com ([32.97.182.137]:56005) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LZ5Wc-0005J7-Kq for qemu-devel@nongnu.org; Mon, 16 Feb 2009 10:36:50 -0500 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e7.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n1GFSqp5025546 for ; Mon, 16 Feb 2009 10:28:52 -0500 Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n1GFanTB193282 for ; Mon, 16 Feb 2009 10:36:49 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n1GFanmr003857 for ; Mon, 16 Feb 2009 10:36:49 -0500 Received: from squirrel.codemonkey.ws (sig-9-65-85-240.mts.ibm.com [9.65.85.240]) by d01av03.pok.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n1GFamtY003832 for ; Mon, 16 Feb 2009 10:36:48 -0500 Message-ID: <499987F6.20400@us.ibm.com> Date: Mon, 16 Feb 2009 09:36:22 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] Fix GPE registers read/write handling. References: <20090212081031.29410.5338.stgit@dhcp-1-237.tlv.redhat.com> In-Reply-To: <20090212081031.29410.5338.stgit@dhcp-1-237.tlv.redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Gleb Natapov wrote: > For STS register bit are cleared by writing 1 into it. > > Signed-off-by: Gleb Natapov > Applied. Thanks. Regards, Anthony Liguori > --- > > hw/acpi.c | 43 +++++++++++++++++++++++++++++++------------ > 1 files changed, 31 insertions(+), 12 deletions(-) > > diff --git a/hw/acpi.c b/hw/acpi.c > index 630910a..5eac1ad 100644 > --- a/hw/acpi.c > +++ b/hw/acpi.c > @@ -579,22 +579,25 @@ struct pci_status { > static struct gpe_regs gpe; > static struct pci_status pci0_status; > > +static uint32_t gpe_read_val(uint16_t val, uint32_t addr) > +{ > + if (addr & 1) > + return (val >> 8) & 0xff; > + return val & 0xff; > +} > + > static uint32_t gpe_readb(void *opaque, uint32_t addr) > { > uint32_t val = 0; > struct gpe_regs *g = opaque; > switch (addr) { > case GPE_BASE: > - val = g->sts & 0xFF; > - break; > case GPE_BASE + 1: > - val = (g->sts >> 8) & 0xFF; > + val = gpe_read_val(g->sts, addr); > break; > case GPE_BASE + 2: > - val = g->en & 0xFF; > - break; > case GPE_BASE + 3: > - val = (g->en >> 8) & 0xFF; > + val = gpe_read_val(g->en, addr); > break; > default: > break; > @@ -606,21 +609,37 @@ static uint32_t gpe_readb(void *opaque, uint32_t addr) > return val; > } > > +static void gpe_write_val(uint16_t *cur, int addr, uint32_t val) > +{ > + if (addr & 1) > + *cur = (*cur & 0xff) | (val << 8); > + else > + *cur = (*cur & 0xff00) | (val & 0xff); > +} > + > +static void gpe_reset_val(uint16_t *cur, int addr, uint32_t val) > +{ > + uint16_t x1, x0 = val & 0xff; > + int shift = (addr & 1) ? 8 : 0; > + > + x1 = (*cur >> shift) & 0xff; > + > + x1 = x1 & ~x0; > + > + *cur = (*cur & (0xff << (8 - shift))) | (x1 << shift); > +} > + > static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val) > { > struct gpe_regs *g = opaque; > switch (addr) { > case GPE_BASE: > - g->sts = (g->sts & ~0xFFFF) | (val & 0xFFFF); > - break; > case GPE_BASE + 1: > - g->sts = (g->sts & 0xFFFF) | (val << 8); > + gpe_reset_val(&g->sts, addr, val); > break; > case GPE_BASE + 2: > - g->en = (g->en & ~0xFFFF) | (val & 0xFFFF); > - break; > case GPE_BASE + 3: > - g->en = (g->en & 0xFFFF) | (val << 8); > + gpe_write_val(&g->en, addr, val); > break; > default: > break; > > > > >