Message ID | 20230302192546.2617633-1-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | [RFC] gdbstub: attempt to split gdb into 32/64 bit targets [!WORKING PLZ HELP] | expand |
On 3/2/23 09:25, Alex Bennée wrote: > -# These have to built to the target ABI > -specific_ss.add(files('syscalls.c')) > +# These have to built to the target ABI but are otherwise target > +# independent > +gdb32_ss = ss.source_set() > +gdb64_ss = ss.source_set() > + > +gdb32_ss.add(files('syscalls.c')) > +gdb64_ss.add(files('syscalls.c')) > + > +gdb32_ss = gdb32_ss.apply(config_host, strict: false) > +gdb64_ss = gdb64_ss.apply(config_host, strict: false) You don't need the source sets. > +libgdb32 = static_library('gdb32', gdb32_ss.sources(), > + name_suffix: 'fa', > + c_args: ['-DTARGET_LONG_BITS=32']) > +libgdb64 = static_library('gdb64', gdb64_ss.sources(), > + name_suffix: 'fa', > + c_args: ['-DTARGET_LONG_BITS=64']) > + > +gdb32 = declare_dependency(link_whole: libgdb32) > +gdb64 = declare_dependency(link_whole: libgdb64) It appears to work with "link_with:". Both comments apply here and to your gdb_user/gdb_softmmu libraries. r~
On 3/2/23 13:21, Richard Henderson wrote: > On 3/2/23 09:25, Alex Bennée wrote: >> -# These have to built to the target ABI >> -specific_ss.add(files('syscalls.c')) >> +# These have to built to the target ABI but are otherwise target >> +# independent >> +gdb32_ss = ss.source_set() >> +gdb64_ss = ss.source_set() >> + >> +gdb32_ss.add(files('syscalls.c')) >> +gdb64_ss.add(files('syscalls.c')) >> + >> +gdb32_ss = gdb32_ss.apply(config_host, strict: false) >> +gdb64_ss = gdb64_ss.apply(config_host, strict: false) > > You don't need the source sets. > >> +libgdb32 = static_library('gdb32', gdb32_ss.sources(), >> + name_suffix: 'fa', >> + c_args: ['-DTARGET_LONG_BITS=32']) >> +libgdb64 = static_library('gdb64', gdb64_ss.sources(), >> + name_suffix: 'fa', >> + c_args: ['-DTARGET_LONG_BITS=64']) >> + >> +gdb32 = declare_dependency(link_whole: libgdb32) >> +gdb64 = declare_dependency(link_whole: libgdb64) > > It appears to work with "link_with:". > > Both comments apply here and to your gdb_user/gdb_softmmu libraries. Hmm. It worked for qemu-system-aarch64, but not qemu-system-avr. I'm at a bit of a loss... r~
On 3/2/23 09:25, Alex Bennée wrote: > Instead of building gdb syscalls for every target only build what > really matters, 64 or 32 bit support. Since the *only* usage of target_ulong is in the va_list for gdb_do_syscall, and as that passes on to printf, we could just adjust the interface to always pass uint64_t. r~
diff --git a/configs/targets/aarch64-linux-user.mak b/configs/targets/aarch64-linux-user.mak index db552f1839..2f8d05d400 100644 --- a/configs/targets/aarch64-linux-user.mak +++ b/configs/targets/aarch64-linux-user.mak @@ -1,5 +1,6 @@ TARGET_ARCH=aarch64 TARGET_BASE_ARCH=arm +TARGET_64BIT=y TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml TARGET_HAS_BFLT=y CONFIG_SEMIHOSTING=y diff --git a/configs/targets/aarch64-softmmu.mak b/configs/targets/aarch64-softmmu.mak index d489e6da83..dacab8b96a 100644 --- a/configs/targets/aarch64-softmmu.mak +++ b/configs/targets/aarch64-softmmu.mak @@ -1,5 +1,6 @@ TARGET_ARCH=aarch64 TARGET_BASE_ARCH=arm +TARGET_64BIT=y TARGET_SUPPORTS_MTTCG=y TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml TARGET_NEED_FDT=y diff --git a/configs/targets/aarch64_be-linux-user.mak b/configs/targets/aarch64_be-linux-user.mak index dc78044fb1..f81ce2bcf2 100644 --- a/configs/targets/aarch64_be-linux-user.mak +++ b/configs/targets/aarch64_be-linux-user.mak @@ -1,5 +1,6 @@ TARGET_ARCH=aarch64 TARGET_BASE_ARCH=arm +TARGET_64BIT=y TARGET_BIG_ENDIAN=y TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml TARGET_HAS_BFLT=y diff --git a/configs/targets/alpha-linux-user.mak b/configs/targets/alpha-linux-user.mak index 7e62fd796a..3714c1f6ae 100644 --- a/configs/targets/alpha-linux-user.mak +++ b/configs/targets/alpha-linux-user.mak @@ -1,4 +1,5 @@ TARGET_ARCH=alpha +TARGET_32BIT=y TARGET_SYSTBL_ABI=common TARGET_SYSTBL=syscall.tbl TARGET_ALIGNED_ONLY=y diff --git a/configs/targets/alpha-softmmu.mak b/configs/targets/alpha-softmmu.mak index e4b874a19e..7c10ce4550 100644 --- a/configs/targets/alpha-softmmu.mak +++ b/configs/targets/alpha-softmmu.mak @@ -1,3 +1,4 @@ TARGET_ARCH=alpha +TARGET_64BIT=y TARGET_ALIGNED_ONLY=y TARGET_SUPPORTS_MTTCG=y diff --git a/configs/targets/arm-softmmu.mak b/configs/targets/arm-softmmu.mak index 92c8349b96..c06975ba86 100644 --- a/configs/targets/arm-softmmu.mak +++ b/configs/targets/arm-softmmu.mak @@ -1,4 +1,5 @@ TARGET_ARCH=arm +TARGET_32BIT=y TARGET_SUPPORTS_MTTCG=y TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml TARGET_NEED_FDT=y diff --git a/configs/targets/sh4-linux-user.mak b/configs/targets/sh4-linux-user.mak index 0152d6621e..39370af1ed 100644 --- a/configs/targets/sh4-linux-user.mak +++ b/configs/targets/sh4-linux-user.mak @@ -1,4 +1,5 @@ TARGET_ARCH=sh4 +TARGET_32BIT=y TARGET_SYSTBL_ABI=common TARGET_SYSTBL=syscall.tbl TARGET_ALIGNED_ONLY=y diff --git a/configs/targets/sh4-softmmu.mak b/configs/targets/sh4-softmmu.mak index 95896376c4..b632e874df 100644 --- a/configs/targets/sh4-softmmu.mak +++ b/configs/targets/sh4-softmmu.mak @@ -1,2 +1,3 @@ TARGET_ARCH=sh4 +TARGET_32BIT=y TARGET_ALIGNED_ONLY=y diff --git a/configs/targets/sh4eb-linux-user.mak b/configs/targets/sh4eb-linux-user.mak index 6724165efe..fdf04dea2b 100644 --- a/configs/targets/sh4eb-linux-user.mak +++ b/configs/targets/sh4eb-linux-user.mak @@ -1,4 +1,5 @@ TARGET_ARCH=sh4 +TARGET_32BIT=y TARGET_SYSTBL_ABI=common TARGET_SYSTBL=syscall.tbl TARGET_ALIGNED_ONLY=y diff --git a/configs/targets/sh4eb-softmmu.mak b/configs/targets/sh4eb-softmmu.mak index dc8b30bf7a..e95b7a5da9 100644 --- a/configs/targets/sh4eb-softmmu.mak +++ b/configs/targets/sh4eb-softmmu.mak @@ -1,3 +1,4 @@ TARGET_ARCH=sh4 +TARGET_32BIT=y TARGET_ALIGNED_ONLY=y TARGET_BIG_ENDIAN=y diff --git a/include/exec/poison.h b/include/exec/poison.h index 140daa4a85..69850b46fa 100644 --- a/include/exec/poison.h +++ b/include/exec/poison.h @@ -42,10 +42,17 @@ #pragma GCC poison TARGET_BIG_ENDIAN #pragma GCC poison BSWAP_NEEDED +/* + * In some special cases we may define TARGET_LONG_BITS directly to + * build 32 and 64 bit versions of a common binary. Therefor if it is + * already defined for the compilation unit don't poison it. + */ +#ifndef TARGET_LONG_BITS #pragma GCC poison TARGET_LONG_BITS #pragma GCC poison TARGET_FMT_lx #pragma GCC poison TARGET_FMT_ld #pragma GCC poison TARGET_FMT_lu +#endif #pragma GCC poison TARGET_PAGE_SIZE #pragma GCC poison TARGET_PAGE_MASK diff --git a/include/exec/target_long.h b/include/exec/target_long.h index 93c9472971..5576543588 100644 --- a/include/exec/target_long.h +++ b/include/exec/target_long.h @@ -20,6 +20,13 @@ #error TARGET_LONG_BITS not defined #endif +/* Sanity check with system configuration via configs/ */ +#if defined(TARGET_64BIT) && TARGET_LONG_BITS != 64 +#error system 64 bit configuration disagrees with cpu-param.h +#elif defined(TARGET_32BIT) && TARGET_LONG_BITS != 32 +#error system 32 bit configuration disagrees with cpu-param.h +#endif + #define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) /* target_ulong is the type of a virtual address */ diff --git a/gdbstub/syscalls.c b/gdbstub/syscalls.c index 1ca3d81305..c01f4d0dea 100644 --- a/gdbstub/syscalls.c +++ b/gdbstub/syscalls.c @@ -13,7 +13,8 @@ */ #include "qemu/osdep.h" -#include "cpu.h" +#include "exec/hwaddr.h" +#include "exec/target_long.h" #include "semihosting/semihost.h" #include "sysemu/runstate.h" #include "gdbstub/user.h" diff --git a/gdbstub/meson.build b/gdbstub/meson.build index d679c7ab86..c8b1f8361b 100644 --- a/gdbstub/meson.build +++ b/gdbstub/meson.build @@ -31,8 +31,32 @@ user_ss.add(gdb_user) gdb_softmmu = declare_dependency(link_whole: libgdb_softmmu) softmmu_ss.add(gdb_softmmu) -# These have to built to the target ABI -specific_ss.add(files('syscalls.c')) +# These have to built to the target ABI but are otherwise target +# independent +gdb32_ss = ss.source_set() +gdb64_ss = ss.source_set() + +gdb32_ss.add(files('syscalls.c')) +gdb64_ss.add(files('syscalls.c')) + +gdb32_ss = gdb32_ss.apply(config_host, strict: false) +gdb64_ss = gdb64_ss.apply(config_host, strict: false) + +libgdb32 = static_library('gdb32', gdb32_ss.sources(), + name_suffix: 'fa', + c_args: ['-DTARGET_LONG_BITS=32']) +libgdb64 = static_library('gdb64', gdb64_ss.sources(), + name_suffix: 'fa', + c_args: ['-DTARGET_LONG_BITS=64']) + +gdb32 = declare_dependency(link_whole: libgdb32) +gdb64 = declare_dependency(link_whole: libgdb64) + +specific_ss.add(when: 'TARGET_64BIT', if_true: gdb64) +specific_ss.add(when: 'TARGET_32BIT', if_true: gdb32) + +# finally add to specific_ss depending on the target bit size +specific_ss.add(when: 'CONFIG_USER_ONLY', if_true: files('user-target.c')) # The user-target is specialised by the guest specific_ss.add(when: 'CONFIG_USER_ONLY', if_true: files('user-target.c')) diff --git a/scripts/make-config-poison.sh b/scripts/make-config-poison.sh index 1892854261..bbbff7c681 100755 --- a/scripts/make-config-poison.sh +++ b/scripts/make-config-poison.sh @@ -5,10 +5,15 @@ if test $# = 0; then fi # Create list of config switches that should be poisoned in common code... -# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special. +# but filter out those which are special including: +# CONFIG_TCG +# CONFIG_USER_ONLY +# TARGET_[32|64]_BIT exec sed -n \ -e' /CONFIG_TCG/d' \ -e '/CONFIG_USER_ONLY/d' \ + -e '/TARGET_64BIT/d' \ + -e '/TARGET_32BIT/d' \ -e '/^#define / {' \ -e 's///' \ -e 's/ .*//' \
Instead of building gdb syscalls for every target only build what really matters, 64 or 32 bit support. [AJB: Any clues or hints, I get a double linking compilation error: FAILED: qemu-system-aarch64 c++ -m64 -mcx16 @qemu-system-aarch64.rsp /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `use_gdb_syscalls': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:50: multiple definition of `use_gdb_syscalls'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:50: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_disable_syscalls': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:71: multiple definition of `gdb_disable_syscalls'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:71: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_syscall_reset': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:76: multiple definition of `gdb_syscall_reset'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:76: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_handled_syscall': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:81: multiple definition of `gdb_handled_syscall'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:81: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_attached': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:39: multiple definition of `gdb_do_syscallv'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:39: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_do_syscall': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:156: multiple definition of `gdb_do_syscall'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:156: first defined here /usr/bin/ld: gdbstub/libgdb64.fa.p/syscalls.c.o: in function `gdb_handle_file_io': /home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:170: multiple definition of `gdb_handle_file_io'; gdbstub/libgdb64.fa.p/syscalls.c.o:/home/alex/lsrc/qemu.git/builds/all/../../gdbstub/syscalls.c:170: first defined here /usr/bin/ld: /lib/x86_64-linux-gnu/libtirpc.so.3: warning: common of `rpc_createerr@@GLIBC_2.2.5' overridden by definition from /lib/x86_64-linux-gnu/libc.so.6 collect2: error: ld returned 1 exit status ] Based-on: <20230302190846.2593720-1-alex.bennee@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- configs/targets/aarch64-linux-user.mak | 1 + configs/targets/aarch64-softmmu.mak | 1 + configs/targets/aarch64_be-linux-user.mak | 1 + configs/targets/alpha-linux-user.mak | 1 + configs/targets/alpha-softmmu.mak | 1 + configs/targets/arm-softmmu.mak | 1 + configs/targets/sh4-linux-user.mak | 1 + configs/targets/sh4-softmmu.mak | 1 + configs/targets/sh4eb-linux-user.mak | 1 + configs/targets/sh4eb-softmmu.mak | 1 + include/exec/poison.h | 7 ++++++ include/exec/target_long.h | 7 ++++++ gdbstub/syscalls.c | 3 ++- gdbstub/meson.build | 28 +++++++++++++++++++++-- scripts/make-config-poison.sh | 7 +++++- 15 files changed, 58 insertions(+), 4 deletions(-)