From: Anthony Liguori <anthony@codemonkey.ws>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Anthony Liguori <aliguori@us.ibm.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] build: fix target_phys_addr_t to 64-bit
Date: Thu, 12 Jan 2012 14:32:33 -0600 [thread overview]
Message-ID: <4F0F4361.10201@codemonkey.ws> (raw)
In-Reply-To: <CAFEAcA-cZTPFf3ewhybMGcFHeWcYwDTyyAzST1LSHiec66hFTQ@mail.gmail.com>
On 01/12/2012 02:06 PM, Peter Maydell wrote:
> On 12 January 2012 17:54, Anthony Liguori<aliguori@us.ibm.com> wrote:
>> This simplifies the build quite a bit and improves the builds performance by
>> not rebuilding many objects twice.
>>
>> There were a surprising number of places that had assumed wrong things about the
>> size of target_phys_addr_t including that it was fixed at 32-bit and that it
>> was identical to target_ulong.
>
> Up until now, in a lot of CPU-specific code it has been perfectly reasonable
> to assume target_phys_addr_t was 32 bits.
No, that's never been a reasonable thing to assume.
>
>
>>
>> Signed-off-by: Anthony Liguori<aliguori@us.ibm.com>
>> ---
>> Makefile | 2 +-
>> Makefile.hw | 25 --------
>> Makefile.objs | 182 +++++++++++++++++++++++++++----------------------------
>> Makefile.target | 4 -
>> configure | 13 +----
>> cpu-common.h | 8 ---
>> dma.h | 2 -
>> hw/a9mpcore.c | 4 +-
>> hw/hw.h | 2 +-
>> hw/intel-hda.c | 4 -
>> hw/omap.h | 6 --
>> hw/pxa2xx_dma.c | 6 +-
>> hw/pxa2xx_lcd.c | 6 +-
>> hw/rtl8139.c | 4 -
>> hw/sh_serial.c | 6 +-
>> monitor.c | 21 ------
>> qemu-log.h | 4 +-
>> targphys.h | 11 ---
>> 18 files changed, 106 insertions(+), 204 deletions(-)
>> delete mode 100644 Makefile.hw
>>
>> diff --git a/Makefile b/Makefile
>> index 2bbc547..32a8ec6 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -197,7 +197,7 @@ $(qga-obj-y) qemu-ga.o: $(QGALIB_GEN) $(GENERATED_HEADERS)
>>
>> qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qobject-obj-y) $(version-obj-y) $(QGALIB_OBJ)
>>
>> -QEMULIBS=libhw32 libhw64 libuser libdis libdis-user
>> +QEMULIBS=libuser libdis libdis-user
>>
>> clean:
>> # avoid old build problems by removing potentially incorrect old files
>> diff --git a/Makefile.hw b/Makefile.hw
>> deleted file mode 100644
>> index 63eb7e4..0000000
>> --- a/Makefile.hw
>> +++ /dev/null
>> @@ -1,25 +0,0 @@
>> -# Makefile for qemu target independent devices.
>> -
>> -include ../config-host.mak
>> -include ../config-all-devices.mak
>> -include config.mak
>> -include $(SRC_PATH)/rules.mak
>> -
>> -.PHONY: all
>> -
>> -$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
>> -
>> -QEMU_CFLAGS+=-I..
>> -QEMU_CFLAGS += $(GLIB_CFLAGS)
>> -
>> -include $(SRC_PATH)/Makefile.objs
>> -
>> -all: $(hw-obj-y)
>> -# Dummy command so that make thinks it has done something
>> - @true
>> -
>> -clean:
>> - rm -f *.o */*.o *.d */*.d *.a */*.a *~ */*~
>> -
>> -# Include automatically generated dependency files
>> --include $(wildcard *.d */*.d)
>> diff --git a/Makefile.objs b/Makefile.objs
>> index 4f6d26c..13a2281 100644
>> --- a/Makefile.objs
>> +++ b/Makefile.objs
>> @@ -179,118 +179,114 @@ user-obj-y += tcg-runtime.o host-utils.o
>> user-obj-y += cutils.o cache-utils.o
>> user-obj-y += $(trace-obj-y)
>>
>> -######################################################################
>> -# libhw
>> -
>> -hw-obj-y =
>> -hw-obj-y += vl.o loader.o
>> -hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
>> -hw-obj-y += usb-libhw.o
>> -hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
>> -hw-obj-y += fw_cfg.o
>> -hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o
>> -hw-obj-$(CONFIG_PCI) += msix.o msi.o
>> -hw-obj-$(CONFIG_PCI) += pci_host.o pcie_host.o
>> -hw-obj-$(CONFIG_PCI) += ioh3420.o xio3130_upstream.o xio3130_downstream.o
>> -hw-obj-y += watchdog.o
>> -hw-obj-$(CONFIG_ISA_MMIO) += isa_mmio.o
>> -hw-obj-$(CONFIG_ECC) += ecc.o
>> -hw-obj-$(CONFIG_NAND) += nand.o
>> -hw-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o
>> -hw-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o
>> -
>> -hw-obj-$(CONFIG_M48T59) += m48t59.o
>> -hw-obj-$(CONFIG_ESCC) += escc.o
>> -hw-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
>> -
>> -hw-obj-$(CONFIG_SERIAL) += serial.o
>> -hw-obj-$(CONFIG_PARALLEL) += parallel.o
>> -hw-obj-$(CONFIG_I8254) += i8254.o
>> -hw-obj-$(CONFIG_PCSPK) += pcspk.o
>> -hw-obj-$(CONFIG_PCKBD) += pckbd.o
>> -hw-obj-$(CONFIG_USB_UHCI) += usb-uhci.o
>> -hw-obj-$(CONFIG_USB_OHCI) += usb-ohci.o
>> -hw-obj-$(CONFIG_USB_EHCI) += usb-ehci.o
>> -hw-obj-$(CONFIG_FDC) += fdc.o
>> -hw-obj-$(CONFIG_ACPI) += acpi.o acpi_piix4.o
>> -hw-obj-$(CONFIG_APM) += pm_smbus.o apm.o
>> -hw-obj-$(CONFIG_DMA) += dma.o
>> -hw-obj-$(CONFIG_HPET) += hpet.o
>> -hw-obj-$(CONFIG_APPLESMC) += applesmc.o
>> -hw-obj-$(CONFIG_SMARTCARD) += usb-ccid.o ccid-card-passthru.o
>> -hw-obj-$(CONFIG_SMARTCARD_NSS) += ccid-card-emulated.o
>> -hw-obj-$(CONFIG_USB_REDIR) += usb-redir.o
>> -hw-obj-$(CONFIG_I8259) += i8259.o
>> +common-obj-y += vl.o loader.o
>> +common-obj-$(CONFIG_VIRTIO) += virtio-console.o
>> +common-obj-y += usb-libhw.o
>> +common-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
>> +common-obj-y += fw_cfg.o
>> +common-obj-$(CONFIG_PCI) += pci.o pci_bridge.o
>> +common-obj-$(CONFIG_PCI) += msix.o msi.o
>> +common-obj-$(CONFIG_PCI) += pci_host.o pcie_host.o
>> +common-obj-$(CONFIG_PCI) += ioh3420.o xio3130_upstream.o xio3130_downstream.o
>> +common-obj-y += watchdog.o
>> +common-obj-$(CONFIG_ISA_MMIO) += isa_mmio.o
>> +common-obj-$(CONFIG_ECC) += ecc.o
>> +common-obj-$(CONFIG_NAND) += nand.o
>> +common-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o
>> +common-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o
>> +
>> +common-obj-$(CONFIG_M48T59) += m48t59.o
>> +common-obj-$(CONFIG_ESCC) += escc.o
>> +common-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
>> +
>> +common-obj-$(CONFIG_SERIAL) += serial.o
>> +common-obj-$(CONFIG_PARALLEL) += parallel.o
>> +common-obj-$(CONFIG_I8254) += i8254.o
>> +common-obj-$(CONFIG_PCSPK) += pcspk.o
>> +common-obj-$(CONFIG_PCKBD) += pckbd.o
>> +common-obj-$(CONFIG_USB_UHCI) += usb-uhci.o
>> +common-obj-$(CONFIG_USB_OHCI) += usb-ohci.o
>> +common-obj-$(CONFIG_USB_EHCI) += usb-ehci.o
>> +common-obj-$(CONFIG_FDC) += fdc.o
>> +common-obj-$(CONFIG_ACPI) += acpi.o acpi_piix4.o
>> +common-obj-$(CONFIG_APM) += pm_smbus.o apm.o
>> +common-obj-$(CONFIG_DMA) += dma.o
>> +common-obj-$(CONFIG_HPET) += hpet.o
>> +common-obj-$(CONFIG_APPLESMC) += applesmc.o
>> +common-obj-$(CONFIG_SMARTCARD) += usb-ccid.o ccid-card-passthru.o
>> +common-obj-$(CONFIG_SMARTCARD_NSS) += ccid-card-emulated.o
>> +common-obj-$(CONFIG_USB_REDIR) += usb-redir.o
>> +common-obj-$(CONFIG_I8259) += i8259.o
>
> Why is all this makefile frobbery in the same patch as
> the things fixing assumptions about the size of the
> type and the actual change to the size of the type?
There was a good reason but I can't remember it. I could probably remove this
and just do common-obj-y += $(hw-obj-y)
>> diff --git a/hw/a9mpcore.c b/hw/a9mpcore.c
>> index 3ef0e13..fece100 100644
>> --- a/hw/a9mpcore.c
>> +++ b/hw/a9mpcore.c
>> @@ -87,8 +87,8 @@ static void a9_scu_write(void *opaque, target_phys_addr_t offset,
>> mask = 0xffffffff;
>> break;
>> default:
>> - fprintf(stderr, "Invalid size %u in write to a9 scu register %x\n",
>> - size, offset);
>> + fprintf(stderr, "Invalid size %u in write to a9 scu register "
>> + TARGET_FMT_plx "\n", size, offset);
>> return;
>> }
>
> I don't like this. When target_phys_addr_t was 32 bits, then
> using TARGET_FMT_plx to print offsets into devices isn't
> too unreasonable as you only get 8 hex digits. If you expand
> to 64 bits then suddenly all these offsets which are actually
> really typically small numbers get printed as 16 hex digits,
> which I think looks bad.
Then cast it to a 32-bit number and print it however you like.
> I'm dubious about the utility of being able to hand a 64 bit
> offset into an device IO routine anyway.
I'm pretty sure it's a hard requirement for PCI devices since the PCI bus is
64-bit and devices would get the full address over the bus of the I/O operation.
But target_phys_addr_t is definitely the wrong type for the memory API (because
the width should have nothing to do with a target).
>> -# if TARGET_PHYS_ADDR_BITS == 32
>> -# define OMAP_FMT_plx "%#08x"
>> -# elif TARGET_PHYS_ADDR_BITS == 64
>> # define OMAP_FMT_plx "%#08" PRIx64
>> -# else
>> -# error TARGET_PHYS_ADDR_BITS undefined
>> -# endif
>
> Same comments about way too many digits in log messages.
> (If this patch or similar goes in at some later date we can
> throw in a cleanup patch to just drop the OMAP_FMT_plx macro.)
You can switch any printf you care about to PRIx64 and then you can use whatever
specifier you want. I don't think changing the semantics of TARGET_FMT_plx is
reasonable in this patch.
>> uint32_t omap_badwidth_read8(void *opaque, target_phys_addr_t addr);
>> void omap_badwidth_write8(void *opaque, target_phys_addr_t addr,
>> diff --git a/hw/pxa2xx_dma.c b/hw/pxa2xx_dma.c
>> index cb28107..ffb391d 100644
>> --- a/hw/pxa2xx_dma.c
>> +++ b/hw/pxa2xx_dma.c
>> @@ -512,9 +512,9 @@ static VMStateDescription vmstate_pxa2xx_dma_chan = {
>> .minimum_version_id = 1,
>> .minimum_version_id_old = 1,
>> .fields = (VMStateField[]) {
>> - VMSTATE_UINTTL(descr, PXA2xxDMAChannel),
>> - VMSTATE_UINTTL(src, PXA2xxDMAChannel),
>> - VMSTATE_UINTTL(dest, PXA2xxDMAChannel),
>> + VMSTATE_UINT64(descr, PXA2xxDMAChannel),
>> + VMSTATE_UINT64(src, PXA2xxDMAChannel),
>> + VMSTATE_UINT64(dest, PXA2xxDMAChannel),
>
> Isn't this a format change demanding a version bump?
Yes.
>> VMSTATE_UINT32(cmd, PXA2xxDMAChannel),
>> VMSTATE_UINT32(state, PXA2xxDMAChannel),
>> VMSTATE_INT32(request, PXA2xxDMAChannel),
>> diff --git a/hw/pxa2xx_lcd.c b/hw/pxa2xx_lcd.c
>> index 5dd4ef0..a84cd77 100644
>> --- a/hw/pxa2xx_lcd.c
>> +++ b/hw/pxa2xx_lcd.c
>> @@ -921,11 +921,11 @@ static const VMStateDescription vmstate_dma_channel = {
>> .minimum_version_id = 0,
>> .minimum_version_id_old = 0,
>> .fields = (VMStateField[]) {
>> - VMSTATE_UINTTL(branch, struct DMAChannel),
>> + VMSTATE_UINT64(branch, struct DMAChannel),
>> VMSTATE_UINT8(up, struct DMAChannel),
>> VMSTATE_BUFFER(pbuffer, struct DMAChannel),
>> - VMSTATE_UINTTL(descriptor, struct DMAChannel),
>> - VMSTATE_UINTTL(source, struct DMAChannel),
>> + VMSTATE_UINT64(descriptor, struct DMAChannel),
>> + VMSTATE_UINT64(source, struct DMAChannel),
>
> Ditto.
Ack.
>> diff --git a/hw/sh_serial.c b/hw/sh_serial.c
>> index 43b0eb1..c612a90 100644
>> --- a/hw/sh_serial.c
>> +++ b/hw/sh_serial.c
>> @@ -186,7 +186,8 @@ static void sh_serial_write(void *opaque, target_phys_addr_t offs,
>> }
>> }
>>
>> - fprintf(stderr, "sh_serial: unsupported write to 0x%02x\n", offs);
>> + fprintf(stderr, "sh_serial: unsupported write to " TARGET_FMT_plx "\n",
>> + offs);
>
> And here you can see that you've clearly just messed up the intended
> two-hex-digits only printing.
This is the only correct solution without doing away with TARGET_FMT_plx entirely.
>
>> abort();
>> }
>>
>> @@ -287,7 +288,8 @@ static uint64_t sh_serial_read(void *opaque, target_phys_addr_t offs,
>> #endif
>>
>> if (ret& ~((1<< 16) - 1)) {
>> - fprintf(stderr, "sh_serial: unsupported read from 0x%02x\n", offs);
>> + fprintf(stderr, "sh_serial: unsupported read from 0x"
>> + TARGET_FMT_plx "\n", offs);
>> abort();
>> }
>>
>> diff --git a/monitor.c b/monitor.c
>> index 7334401..be3d7f4 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -1274,26 +1274,6 @@ static void do_print(Monitor *mon, const QDict *qdict)
>> int format = qdict_get_int(qdict, "format");
>> target_phys_addr_t val = qdict_get_int(qdict, "val");
>>
>> -#if TARGET_PHYS_ADDR_BITS == 32
>> - switch(format) {
>> - case 'o':
>> - monitor_printf(mon, "%#o", val);
>> - break;
>> - case 'x':
>> - monitor_printf(mon, "%#x", val);
>> - break;
>> - case 'u':
>> - monitor_printf(mon, "%u", val);
>> - break;
>> - default:
>> - case 'd':
>> - monitor_printf(mon, "%d", val);
>> - break;
>> - case 'c':
>> - monitor_printc(mon, val);
>> - break;
>> - }
>> -#else
>> switch(format) {
>> case 'o':
>> monitor_printf(mon, "%#" PRIo64, val);
>> @@ -1312,7 +1292,6 @@ static void do_print(Monitor *mon, const QDict *qdict)
>> monitor_printc(mon, val);
>> break;
>> }
>> -#endif
>> monitor_printf(mon, "\n");
>> }
>>
>> diff --git a/qemu-log.h b/qemu-log.h
>> index fccfb110..7c9180c 100644
>> --- a/qemu-log.h
>> +++ b/qemu-log.h
>> @@ -51,6 +51,7 @@ extern int loglevel;
>> /* Special cases: */
>>
>> /* cpu_dump_state() logging functions: */
>> +#ifdef NEED_CPU_H
>> #define log_cpu_state(env, f) cpu_dump_state((env), logfile, fprintf, (f));
>> #define log_cpu_state_mask(b, env, f) do { \
>> if (loglevel& (b)) log_cpu_state((env), (f)); \
>> @@ -64,8 +65,7 @@ extern int loglevel;
>>
>> /* page_dump() output to the log file: */
>> #define log_page_dump() page_dump(logfile)
>> -
>> -
>> +#endif
>
> Why does this #ifdef become necessary? (not saying it isn't,
> just wondering)
GCC poisoning is very aggressive and actually will complain because
cpu_dump_state() is used in a macro (even though it's not instantiated anywhere).
Regards,
Anthony Liguori
>
>>
>> /* Maintenance: */
>>
>> diff --git a/targphys.h b/targphys.h
>> index 95648d6..8c4928a 100644
>> --- a/targphys.h
>> +++ b/targphys.h
>> @@ -3,19 +3,8 @@
>> #ifndef TARGPHYS_H
>> #define TARGPHYS_H
>>
>> -#ifdef TARGET_PHYS_ADDR_BITS
>> -/* target_phys_addr_t is the type of a physical address (its size can
>> - be different from 'target_ulong'). */
>> -
>> -#if TARGET_PHYS_ADDR_BITS == 32
>> -typedef uint32_t target_phys_addr_t;
>> -#define TARGET_PHYS_ADDR_MAX UINT32_MAX
>> -#define TARGET_FMT_plx "%08x"
>> -#elif TARGET_PHYS_ADDR_BITS == 64
>> typedef uint64_t target_phys_addr_t;
>> #define TARGET_PHYS_ADDR_MAX UINT64_MAX
>> #define TARGET_FMT_plx "%016" PRIx64
>> -#endif
>> -#endif
>>
>> #endif
>> --
>> 1.7.4.1
>
>
> -- PMM
>
next prev parent reply other threads:[~2012-01-12 20:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-12 17:54 [Qemu-devel] [PATCH] build: fix target_phys_addr_t to 64-bit Anthony Liguori
2012-01-12 18:51 ` Andreas Färber
2012-01-12 20:06 ` Peter Maydell
2012-01-12 20:32 ` Anthony Liguori [this message]
2012-01-12 22:42 ` Peter Maydell
2012-01-12 22:46 ` Peter Maydell
2012-01-12 22:56 ` Anthony Liguori
2012-01-12 23:29 ` Peter Maydell
2012-01-12 23:47 ` Andreas Färber
2012-01-13 1:13 ` Peter Maydell
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=4F0F4361.10201@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=aliguori@us.ibm.com \
--cc=peter.maydell@linaro.org \
--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 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).