Message ID | 20250403234914.9154-5-philmd@linaro.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | qemu: Introduce TargetInfo API (for single binary) | expand |
On 4/3/25 16:48, Philippe Mathieu-Daudé wrote: > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > include/exec/tswap.h | 13 +------------ > include/qemu/target_info-impl.h | 4 ++++ > include/qemu/target_info.h | 11 +++++++++++ > cpu-target.c | 6 ------ > hw/core/cpu-system.c | 2 +- > hw/display/vga.c | 2 +- > hw/virtio/virtio.c | 2 +- > system/qtest.c | 1 + > target_info-stub.c | 1 + > target_info.c | 5 +++++ > 10 files changed, 26 insertions(+), 21 deletions(-) > > diff --git a/include/exec/tswap.h b/include/exec/tswap.h > index 84060a49994..415781b2bcc 100644 > --- a/include/exec/tswap.h > +++ b/include/exec/tswap.h > @@ -9,18 +9,7 @@ > #define TSWAP_H > > #include "qemu/bswap.h" > - > -/** > - * target_words_bigendian: > - * Returns true if the (default) endianness of the target is big endian, > - * false otherwise. Common code should normally never need to know about the > - * endianness of the target, so please do *not* use this function unless you > - * know very well what you are doing! > - */ > -bool target_words_bigendian(void); > -#ifdef COMPILING_PER_TARGET > -#define target_words_bigendian() TARGET_BIG_ENDIAN > -#endif > +#include "qemu/target_info.h" > > /* > * If we're in target-specific code, we can hard-code the swapping > diff --git a/include/qemu/target_info-impl.h b/include/qemu/target_info-impl.h > index 0cec211e362..14566e4a913 100644 > --- a/include/qemu/target_info-impl.h > +++ b/include/qemu/target_info-impl.h > @@ -10,6 +10,7 @@ > #define QEMU_TARGET_INFO_IMPL_H > > #include "qemu/target_info.h" > +#include "qapi/qapi-types-common.h" > #include "qapi/qapi-types-machine.h" > > struct BinaryTargetInfo { > @@ -23,6 +24,9 @@ struct BinaryTargetInfo { > /* related to TARGET_ARCH definition */ > SysEmuTarget system_arch; > > + /* related to TARGET_BIG_ENDIAN definition */ > + EndianMode endianness; > + > }; > > #endif > diff --git a/include/qemu/target_info.h b/include/qemu/target_info.h > index 6ca36dae8a3..e84f16d1034 100644 > --- a/include/qemu/target_info.h > +++ b/include/qemu/target_info.h > @@ -21,4 +21,15 @@ const char *target_name(void); > > SysEmuTarget target_system_arch(void); > > +/** > + * target_words_bigendian: > + * Returns true if the (default) endianness of the target is big endian, > + * false otherwise. Note that in target-specific code, you can use > + * TARGET_BIG_ENDIAN directly instead. On the other hand, common > + * code should normally never need to know about the endianness of the > + * target, so please do *not* use this function unless you know very well > + * what you are doing! > + */ > +bool target_words_bigendian(void); > + We don't want to reintroduce TARGET_BIG_ENDIAN in the comment, it was purposefully removed previously. > #endif > diff --git a/cpu-target.c b/cpu-target.c > index 3f82d3ea444..761c2d28645 100644 > --- a/cpu-target.c > +++ b/cpu-target.c > @@ -159,9 +159,3 @@ void cpu_abort(CPUState *cpu, const char *fmt, ...) > #endif > abort(); > } > - > -#undef target_words_bigendian > -bool target_words_bigendian(void) > -{ > - return TARGET_BIG_ENDIAN; > -} > diff --git a/hw/core/cpu-system.c b/hw/core/cpu-system.c > index 82b68b8927d..32700c49b43 100644 > --- a/hw/core/cpu-system.c > +++ b/hw/core/cpu-system.c > @@ -24,7 +24,7 @@ > #include "exec/cputlb.h" > #include "system/memory.h" > #include "exec/tb-flush.h" > -#include "exec/tswap.h" > +#include "qemu/target_info.h" > #include "hw/qdev-core.h" > #include "hw/qdev-properties.h" > #include "hw/core/sysemu-cpu-ops.h" > diff --git a/hw/display/vga.c b/hw/display/vga.c > index b01f67c65fb..1883e03d3d8 100644 > --- a/hw/display/vga.c > +++ b/hw/display/vga.c > @@ -26,7 +26,7 @@ > #include "qemu/units.h" > #include "system/reset.h" > #include "qapi/error.h" > -#include "exec/tswap.h" > +#include "qemu/target_info.h" > #include "hw/display/vga.h" > #include "hw/i386/x86.h" > #include "hw/pci/pci.h" > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index 85110bce374..4ef56c183b2 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -20,7 +20,7 @@ > #include "qemu/log.h" > #include "qemu/main-loop.h" > #include "qemu/module.h" > -#include "exec/tswap.h" > +#include "qemu/target_info.h" > #include "qom/object_interfaces.h" > #include "hw/core/cpu.h" > #include "hw/virtio/virtio.h" > diff --git a/system/qtest.c b/system/qtest.c > index 523a0479959..6146a7bfdc0 100644 > --- a/system/qtest.c > +++ b/system/qtest.c > @@ -29,6 +29,7 @@ > #include "qemu/error-report.h" > #include "qemu/module.h" > #include "qemu/cutils.h" > +#include "qemu/target_info.h" > #include "qom/object_interfaces.h" > > #define MAX_IRQ 256 > diff --git a/target_info-stub.c b/target_info-stub.c > index 46a240ac66a..c1a15f5cc12 100644 > --- a/target_info-stub.c > +++ b/target_info-stub.c > @@ -15,6 +15,7 @@ static const BinaryTargetInfo target_info_stub = { > .is_stub = true, > .name = TARGET_NAME, > .system_arch = -1, > + .endianness = TARGET_BIG_ENDIAN ? ENDIAN_MODE_BIG : ENDIAN_MODE_LITTLE, > }; > > const BinaryTargetInfo *target_info(void) > diff --git a/target_info.c b/target_info.c > index be4f19009b3..22796dda543 100644 > --- a/target_info.c > +++ b/target_info.c > @@ -31,3 +31,8 @@ SysEmuTarget target_system_arch(void) > } > return system_arch; > } > + > +bool target_words_bigendian(void) > +{ > + return target_info()->endianness == ENDIAN_MODE_BIG; > +} With the comment update, Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/include/exec/tswap.h b/include/exec/tswap.h index 84060a49994..415781b2bcc 100644 --- a/include/exec/tswap.h +++ b/include/exec/tswap.h @@ -9,18 +9,7 @@ #define TSWAP_H #include "qemu/bswap.h" - -/** - * target_words_bigendian: - * Returns true if the (default) endianness of the target is big endian, - * false otherwise. Common code should normally never need to know about the - * endianness of the target, so please do *not* use this function unless you - * know very well what you are doing! - */ -bool target_words_bigendian(void); -#ifdef COMPILING_PER_TARGET -#define target_words_bigendian() TARGET_BIG_ENDIAN -#endif +#include "qemu/target_info.h" /* * If we're in target-specific code, we can hard-code the swapping diff --git a/include/qemu/target_info-impl.h b/include/qemu/target_info-impl.h index 0cec211e362..14566e4a913 100644 --- a/include/qemu/target_info-impl.h +++ b/include/qemu/target_info-impl.h @@ -10,6 +10,7 @@ #define QEMU_TARGET_INFO_IMPL_H #include "qemu/target_info.h" +#include "qapi/qapi-types-common.h" #include "qapi/qapi-types-machine.h" struct BinaryTargetInfo { @@ -23,6 +24,9 @@ struct BinaryTargetInfo { /* related to TARGET_ARCH definition */ SysEmuTarget system_arch; + /* related to TARGET_BIG_ENDIAN definition */ + EndianMode endianness; + }; #endif diff --git a/include/qemu/target_info.h b/include/qemu/target_info.h index 6ca36dae8a3..e84f16d1034 100644 --- a/include/qemu/target_info.h +++ b/include/qemu/target_info.h @@ -21,4 +21,15 @@ const char *target_name(void); SysEmuTarget target_system_arch(void); +/** + * target_words_bigendian: + * Returns true if the (default) endianness of the target is big endian, + * false otherwise. Note that in target-specific code, you can use + * TARGET_BIG_ENDIAN directly instead. On the other hand, common + * code should normally never need to know about the endianness of the + * target, so please do *not* use this function unless you know very well + * what you are doing! + */ +bool target_words_bigendian(void); + #endif diff --git a/cpu-target.c b/cpu-target.c index 3f82d3ea444..761c2d28645 100644 --- a/cpu-target.c +++ b/cpu-target.c @@ -159,9 +159,3 @@ void cpu_abort(CPUState *cpu, const char *fmt, ...) #endif abort(); } - -#undef target_words_bigendian -bool target_words_bigendian(void) -{ - return TARGET_BIG_ENDIAN; -} diff --git a/hw/core/cpu-system.c b/hw/core/cpu-system.c index 82b68b8927d..32700c49b43 100644 --- a/hw/core/cpu-system.c +++ b/hw/core/cpu-system.c @@ -24,7 +24,7 @@ #include "exec/cputlb.h" #include "system/memory.h" #include "exec/tb-flush.h" -#include "exec/tswap.h" +#include "qemu/target_info.h" #include "hw/qdev-core.h" #include "hw/qdev-properties.h" #include "hw/core/sysemu-cpu-ops.h" diff --git a/hw/display/vga.c b/hw/display/vga.c index b01f67c65fb..1883e03d3d8 100644 --- a/hw/display/vga.c +++ b/hw/display/vga.c @@ -26,7 +26,7 @@ #include "qemu/units.h" #include "system/reset.h" #include "qapi/error.h" -#include "exec/tswap.h" +#include "qemu/target_info.h" #include "hw/display/vga.h" #include "hw/i386/x86.h" #include "hw/pci/pci.h" diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 85110bce374..4ef56c183b2 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -20,7 +20,7 @@ #include "qemu/log.h" #include "qemu/main-loop.h" #include "qemu/module.h" -#include "exec/tswap.h" +#include "qemu/target_info.h" #include "qom/object_interfaces.h" #include "hw/core/cpu.h" #include "hw/virtio/virtio.h" diff --git a/system/qtest.c b/system/qtest.c index 523a0479959..6146a7bfdc0 100644 --- a/system/qtest.c +++ b/system/qtest.c @@ -29,6 +29,7 @@ #include "qemu/error-report.h" #include "qemu/module.h" #include "qemu/cutils.h" +#include "qemu/target_info.h" #include "qom/object_interfaces.h" #define MAX_IRQ 256 diff --git a/target_info-stub.c b/target_info-stub.c index 46a240ac66a..c1a15f5cc12 100644 --- a/target_info-stub.c +++ b/target_info-stub.c @@ -15,6 +15,7 @@ static const BinaryTargetInfo target_info_stub = { .is_stub = true, .name = TARGET_NAME, .system_arch = -1, + .endianness = TARGET_BIG_ENDIAN ? ENDIAN_MODE_BIG : ENDIAN_MODE_LITTLE, }; const BinaryTargetInfo *target_info(void) diff --git a/target_info.c b/target_info.c index be4f19009b3..22796dda543 100644 --- a/target_info.c +++ b/target_info.c @@ -31,3 +31,8 @@ SysEmuTarget target_system_arch(void) } return system_arch; } + +bool target_words_bigendian(void) +{ + return target_info()->endianness == ENDIAN_MODE_BIG; +}
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- include/exec/tswap.h | 13 +------------ include/qemu/target_info-impl.h | 4 ++++ include/qemu/target_info.h | 11 +++++++++++ cpu-target.c | 6 ------ hw/core/cpu-system.c | 2 +- hw/display/vga.c | 2 +- hw/virtio/virtio.c | 2 +- system/qtest.c | 1 + target_info-stub.c | 1 + target_info.c | 5 +++++ 10 files changed, 26 insertions(+), 21 deletions(-)