* [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 @ 2017-06-27 22:50 John Baldwin 2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin ` (2 more replies) 0 siblings, 3 replies; 17+ messages in thread From: John Baldwin @ 2017-06-27 22:50 UTC (permalink / raw) To: gdb-patches I did not add the fs_base and gs_base registers to the x32 descriptions since I'm not aware of a platform supporting x32 other than Linux. On the other hand, I wonder if we shouldn't just add fs_base and gs_base to the "core" descriptions alongside "fs" and "gs" rather than using a separate feature if they are always going to be present. The manual dependencies for the various x86 regformat data files have several inconsistencies (missing dependencies or in some cases wrong dependencies), but I didn't do a fixup of those since Yao's patches are going to replace all that anyway. John Baldwin (2): Include the fs_base and gs_base registers in amd64 target descriptions. Support the fs_base and gs_base registers on FreeBSD/amd64 native processes. gdb/ChangeLog | 32 ++++ gdb/amd64-bsd-nat.c | 54 +++++++ gdb/features/Makefile | 14 +- gdb/features/i386/amd64-avx-avx512.c | 180 +++++++++++---------- gdb/features/i386/amd64-avx-avx512.xml | 1 + gdb/features/i386/amd64-avx-mpx-avx512-pku.c | 194 ++++++++++++----------- gdb/features/i386/amd64-avx-mpx-avx512-pku.xml | 1 + gdb/features/i386/amd64-avx-mpx.c | 48 +++--- gdb/features/i386/amd64-avx-mpx.xml | 1 + gdb/features/i386/amd64-avx.c | 36 +++-- gdb/features/i386/amd64-avx.xml | 1 + gdb/features/i386/amd64-mpx.c | 16 +- gdb/features/i386/amd64-mpx.xml | 1 + gdb/features/i386/amd64.c | 4 + gdb/features/i386/amd64.xml | 1 + gdb/regformats/i386/amd64-avx-avx512.dat | 2 + gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat | 1 - gdb/regformats/i386/amd64-avx-mpx.dat | 2 + gdb/regformats/i386/amd64-avx.dat | 2 + gdb/regformats/i386/amd64-mpx.dat | 2 + gdb/regformats/i386/amd64.dat | 2 + 21 files changed, 361 insertions(+), 234 deletions(-) -- 2.11.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin @ 2017-06-27 22:51 ` John Baldwin 2017-07-11 8:03 ` Yao Qi 2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin 2017-07-11 7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi 2 siblings, 1 reply; 17+ messages in thread From: John Baldwin @ 2017-06-27 22:51 UTC (permalink / raw) To: gdb-patches This permits these registers to be used with non-Linux targets. gdb/ChangeLog: * features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat) (amd64-avx-mpx.dat, amd64-avx-avx512.dat) (amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in those rules. * features/i386/amd64-avx-avx512.xml: Add 64bit-segments.xml. * features/i386/amd64-avx-mpx-avx512-pku.xml: Add 64bit-segments.xml. * features/i386/amd64-avx-mpx.xml: Add 64bit-segments.xml. * features/i386/amd64-avx.xml: Add 64bit-segments.xml. * features/i386/amd64-mpx.xml: Add 64bit-segments.xml. * features/i386/amd64.xml: Add 64bit-segments.xml. * features/i386/amd64-avx-avx512.c: Regenerated. * features/i386/amd64-avx-mpx-avx512-pku.c: Regenerated. * features/i386/amd64-avx-mpx.c: Regenerated. * features/i386/amd64-avx.c: Regenerated. * features/i386/amd64-mpx.c: Regenerated. * features/i386/amd64.c: Regenerated. * regformats/i386/amd64-avx-avx512.dat: Regenerated. * regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated. * regformats/i386/amd64-avx-mpx.dat: Regenerated. * regformats/i386/amd64-avx.dat: Regenerated. * regformats/i386/amd64-mpx.dat: Regenerated. * regformats/i386/amd64.dat: Regenerated. --- gdb/ChangeLog | 25 +++ gdb/features/Makefile | 14 +- gdb/features/i386/amd64-avx-avx512.c | 180 +++++++++++---------- gdb/features/i386/amd64-avx-avx512.xml | 1 + gdb/features/i386/amd64-avx-mpx-avx512-pku.c | 194 ++++++++++++----------- gdb/features/i386/amd64-avx-mpx-avx512-pku.xml | 1 + gdb/features/i386/amd64-avx-mpx.c | 48 +++--- gdb/features/i386/amd64-avx-mpx.xml | 1 + gdb/features/i386/amd64-avx.c | 36 +++-- gdb/features/i386/amd64-avx.xml | 1 + gdb/features/i386/amd64-mpx.c | 16 +- gdb/features/i386/amd64-mpx.xml | 1 + gdb/features/i386/amd64.c | 4 + gdb/features/i386/amd64.xml | 1 + gdb/regformats/i386/amd64-avx-avx512.dat | 2 + gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat | 1 - gdb/regformats/i386/amd64-avx-mpx.dat | 2 + gdb/regformats/i386/amd64-avx.dat | 2 + gdb/regformats/i386/amd64-mpx.dat | 2 + gdb/regformats/i386/amd64.dat | 2 + 20 files changed, 300 insertions(+), 234 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4e091d7e40..2196419fa3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,28 @@ +2017-06-26 John Baldwin <jhb@FreeBSD.org> + + * features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat) + (amd64-avx-mpx.dat, amd64-avx-avx512.dat) + (amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in + those rules. + * features/i386/amd64-avx-avx512.xml: Add 64bit-segments.xml. + * features/i386/amd64-avx-mpx-avx512-pku.xml: Add 64bit-segments.xml. + * features/i386/amd64-avx-mpx.xml: Add 64bit-segments.xml. + * features/i386/amd64-avx.xml: Add 64bit-segments.xml. + * features/i386/amd64-mpx.xml: Add 64bit-segments.xml. + * features/i386/amd64.xml: Add 64bit-segments.xml. + * features/i386/amd64-avx-avx512.c: Regenerated. + * features/i386/amd64-avx-mpx-avx512-pku.c: Regenerated. + * features/i386/amd64-avx-mpx.c: Regenerated. + * features/i386/amd64-avx.c: Regenerated. + * features/i386/amd64-mpx.c: Regenerated. + * features/i386/amd64.c: Regenerated. + * regformats/i386/amd64-avx-avx512.dat: Regenerated. + * regformats/i386/amd64-avx-mpx-avx512-pku.dat: Regenerated. + * regformats/i386/amd64-avx-mpx.dat: Regenerated. + * regformats/i386/amd64-avx.dat: Regenerated. + * regformats/i386/amd64-mpx.dat: Regenerated. + * regformats/i386/amd64.dat: Regenerated. + 2017-06-19 John Baldwin <jhb@FreeBSD.org> * mips-tdep.c (print_gp_register_row): Don't error for unavailable diff --git a/gdb/features/Makefile b/gdb/features/Makefile index 3bc8b5ae85..199a315379 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -263,7 +263,8 @@ $(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml $(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml $(outdir)/i386/i386-linux.dat: i386/32bit-core.xml i386/32bit-sse.xml \ i386/32bit-linux.xml -$(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml +$(outdir)/i386/amd64.dat: i386/64bit-core.xml i386/64bit-sse.xml \ + i386/64bit-segments.xml $(outdir)/i386/amd64-linux.dat: i386/64bit-core.xml i386/64bit-sse.xml \ i386/64bit-linux.xml i386/64bit-segments.xml $(outdir)/i386/i386-avx.dat: i386/32bit-core.xml i386/32bit-avx.xml @@ -289,7 +290,8 @@ $(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml \ i386/32bit-pkeys.xml i386/32bit-linux.xml $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml i386/32bit-linux.xml -$(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml +$(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml \ + i386/64bit-segments.xml $(outdir)/i386/amd64-avx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ i386/64bit-linux.xml i386/64bit-segments.xml $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ @@ -297,16 +299,16 @@ $(outdir)/i386/amd64-mpx-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ $(outdir)/i386/amd64-avx-mpx-linux.dat: i386/64bit-core.xml \ i386/64bit-linux.xml i386/64bit-segments.xml i386/64bit-mpx.xml $(outdir)/i386/amd64-mpx.dat: i386/64bit-core.xml i386/64bit-avx.xml \ - i386/64bit-mpx.xml + i386/64bit-segments.xml i386/64bit-mpx.xml $(outdir)/i386/amd64-avx-mpx.dat: i386/64bit-core.xml \ - i386/64bit-mpx.xml + i386/64bit-segments.xml i386/64bit-mpx.xml $(outdir)/i386/amd64-avx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \ - i386/64bit-avx512.xml + i386/64bit-avx512.xml i386/64bit-segments.xml $(outdir)/i386/amd64-avx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \ i386/64bit-avx512.xml i386/64bit-linux.xml $(outdir)/i386/amd64-avx-mpx-avx512-pku.dat: i386/64bit-core.xml \ i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \ - i386/64bit-pkeys.xml + i386/64bit-pkeys.xml i386/64bit-segments.xml $(outdir)/i386/amd64-avx-mpx-avx512-pku-linux.dat: i386/64bit-core.xml \ i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \ i386/64bit-linux.xml i386/64bit-segments.xml \ diff --git a/gdb/features/i386/amd64-avx-avx512.c b/gdb/features/i386/amd64-avx-avx512.c index 8a185c108d..f1ebde1071 100644 --- a/gdb/features/i386/amd64-avx-avx512.c +++ b/gdb/features/i386/amd64-avx-avx512.c @@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_avx512 (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); - tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512"); field_type = tdesc_named_type (feature, "ieee_single"); @@ -202,78 +206,78 @@ initialize_tdesc_amd64_avx_avx512 (void) field_type = tdesc_named_type (feature, "uint128"); tdesc_create_vector (feature, "v2ui128", field_type, 2); - tdesc_create_reg (feature, "xmm16", 73, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm17", 74, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm18", 75, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm19", 76, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm20", 77, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm21", 78, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm22", 79, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm23", 80, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm24", 81, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm25", 82, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm26", 83, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm27", 84, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm28", 85, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm29", 86, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm30", 87, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm31", 88, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "ymm16h", 89, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm17h", 90, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm18h", 91, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm19h", 92, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm20h", 93, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm21h", 94, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm22h", 95, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm23h", 96, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm24h", 97, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm25h", 98, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm26h", 99, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm27h", 100, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm28h", 101, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm29h", 102, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm30h", 103, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm31h", 104, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "k0", 105, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k1", 106, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k2", 107, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k3", 108, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k4", 109, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k5", 110, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k6", 111, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k7", 112, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "zmm0h", 113, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm1h", 114, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm2h", 115, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm3h", 116, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm4h", 117, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm5h", 118, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm6h", 119, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm7h", 120, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm8h", 121, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm9h", 122, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm10h", 123, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm11h", 124, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm12h", 125, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm13h", 126, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm14h", 127, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm15h", 128, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm16h", 129, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm17h", 130, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm18h", 131, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm19h", 132, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm20h", 133, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm21h", 134, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm22h", 135, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm23h", 136, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm24h", 137, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm25h", 138, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm26h", 139, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm27h", 140, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm28h", 141, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm29h", 142, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm30h", 143, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "xmm16", 75, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm17", 76, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm18", 77, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm19", 78, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm20", 79, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm21", 80, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm22", 81, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm23", 82, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm24", 83, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm25", 84, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm26", 85, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm27", 86, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm28", 87, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm29", 88, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm30", 89, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm31", 90, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "ymm16h", 91, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm17h", 92, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm18h", 93, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm19h", 94, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm20h", 95, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm21h", 96, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm22h", 97, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm23h", 98, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm24h", 99, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm25h", 100, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm26h", 101, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm27h", 102, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm28h", 103, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm29h", 104, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm30h", 105, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm31h", 106, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "k0", 107, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k1", 108, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k2", 109, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k3", 110, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k4", 111, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k5", 112, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k6", 113, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k7", 114, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "zmm0h", 115, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm1h", 116, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm2h", 117, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm3h", 118, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm4h", 119, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm5h", 120, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm6h", 121, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm7h", 122, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm8h", 123, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm9h", 124, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm10h", 125, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm11h", 126, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm12h", 127, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm13h", 128, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm14h", 129, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm15h", 130, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm16h", 131, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm17h", 132, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm18h", 133, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm19h", 134, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm20h", 135, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm21h", 136, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm22h", 137, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm23h", 138, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm24h", 139, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm25h", 140, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm26h", 141, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm27h", 142, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm28h", 143, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm29h", 144, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm30h", 145, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm31h", 146, 1, NULL, 256, "v2ui128"); tdesc_amd64_avx_avx512 = result; } diff --git a/gdb/features/i386/amd64-avx-avx512.xml b/gdb/features/i386/amd64-avx-avx512.xml index a4587433c8..fdf8136f74 100644 --- a/gdb/features/i386/amd64-avx-avx512.xml +++ b/gdb/features/i386/amd64-avx-avx512.xml @@ -12,6 +12,7 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> <xi:include href="64bit-avx.xml"/> <xi:include href="64bit-avx512.xml"/> </target> diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c index dfe7d7778a..f119e52f5d 100644 --- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.c +++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c @@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); - tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); type = tdesc_create_struct (feature, "br128"); @@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) field_type = tdesc_named_type (feature, "_bndcfgu"); tdesc_add_field (type, "config", field_type); - tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu"); - tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status"); + tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu"); + tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status"); feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512"); field_type = tdesc_named_type (feature, "ieee_single"); @@ -240,81 +244,81 @@ initialize_tdesc_amd64_avx_mpx_avx512_pku (void) field_type = tdesc_named_type (feature, "uint128"); tdesc_create_vector (feature, "v2ui128", field_type, 2); - tdesc_create_reg (feature, "xmm16", 79, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm17", 80, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm18", 81, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm19", 82, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm20", 83, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm21", 84, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm22", 85, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm23", 86, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm24", 87, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm25", 88, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm26", 89, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm27", 90, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm28", 91, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm29", 92, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm30", 93, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "xmm31", 94, 1, NULL, 128, "vec128"); - tdesc_create_reg (feature, "ymm16h", 95, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm17h", 96, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm18h", 97, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm19h", 98, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm20h", 99, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm21h", 100, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm22h", 101, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm23h", 102, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm24h", 103, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm25h", 104, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm26h", 105, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm27h", 106, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm28h", 107, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm29h", 108, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm30h", 109, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm31h", 110, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "k0", 111, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k1", 112, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k2", 113, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k3", 114, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k4", 115, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k5", 116, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k6", 117, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "k7", 118, 1, NULL, 64, "uint64"); - tdesc_create_reg (feature, "zmm0h", 119, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm1h", 120, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm2h", 121, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm3h", 122, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm4h", 123, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm5h", 124, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm6h", 125, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm7h", 126, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm8h", 127, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm9h", 128, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm10h", 129, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm11h", 130, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm12h", 131, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm13h", 132, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm14h", 133, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm15h", 134, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm16h", 135, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm17h", 136, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm18h", 137, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm19h", 138, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm20h", 139, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm21h", 140, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm22h", 141, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm23h", 142, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm24h", 143, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm25h", 144, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm26h", 145, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm27h", 146, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm28h", 147, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm29h", 148, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128"); - tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "xmm16", 81, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm17", 82, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm18", 83, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm19", 84, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm20", 85, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm21", 86, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm22", 87, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm23", 88, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm24", 89, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm25", 90, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm26", 91, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm27", 92, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm28", 93, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm29", 94, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm30", 95, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm31", 96, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "ymm16h", 97, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm17h", 98, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm18h", 99, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm19h", 100, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm20h", 101, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm21h", 102, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm22h", 103, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm23h", 104, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm24h", 105, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm25h", 106, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm26h", 107, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm27h", 108, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm28h", 109, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm29h", 110, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm30h", 111, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm31h", 112, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "k0", 113, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k1", 114, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k2", 115, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k3", 116, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k4", 117, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k5", 118, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k6", 119, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k7", 120, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "zmm0h", 121, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm1h", 122, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm2h", 123, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm3h", 124, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm4h", 125, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm5h", 126, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm6h", 127, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm7h", 128, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm8h", 129, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm9h", 130, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm10h", 131, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm11h", 132, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm12h", 133, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm13h", 134, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm14h", 135, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm15h", 136, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm16h", 137, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm17h", 138, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm18h", 139, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm19h", 140, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm20h", 141, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm21h", 142, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm22h", 143, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm23h", 144, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm24h", 145, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm25h", 146, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm26h", 147, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm27h", 148, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm28h", 149, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm29h", 150, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm30h", 151, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm31h", 152, 1, NULL, 256, "v2ui128"); feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys"); - tdesc_create_reg (feature, "pkru", 151, 1, NULL, 32, "uint32"); + tdesc_create_reg (feature, "pkru", 153, 1, NULL, 32, "uint32"); tdesc_amd64_avx_mpx_avx512_pku = result; } diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml index e769108873..d8203e3400 100644 --- a/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml +++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml @@ -12,6 +12,7 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> <xi:include href="64bit-avx.xml"/> <xi:include href="64bit-mpx.xml"/> <xi:include href="64bit-avx512.xml"/> diff --git a/gdb/features/i386/amd64-avx-mpx.c b/gdb/features/i386/amd64-avx-mpx.c index ab56f42f13..0c5161fe8d 100644 --- a/gdb/features/i386/amd64-avx-mpx.c +++ b/gdb/features/i386/amd64-avx-mpx.c @@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx_mpx (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); - tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); type = tdesc_create_struct (feature, "br128"); @@ -195,12 +199,12 @@ initialize_tdesc_amd64_avx_mpx (void) field_type = tdesc_named_type (feature, "_bndcfgu"); tdesc_add_field (type, "config", field_type); - tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu"); - tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status"); + tdesc_create_reg (feature, "bnd0raw", 75, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd1raw", 76, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd2raw", 77, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd3raw", 78, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bndcfgu", 79, 1, NULL, 64, "cfgu"); + tdesc_create_reg (feature, "bndstatus", 80, 1, NULL, 64, "status"); tdesc_amd64_avx_mpx = result; } diff --git a/gdb/features/i386/amd64-avx-mpx.xml b/gdb/features/i386/amd64-avx-mpx.xml index 0001dc8413..001cc58fa6 100644 --- a/gdb/features/i386/amd64-avx-mpx.xml +++ b/gdb/features/i386/amd64-avx-mpx.xml @@ -12,6 +12,7 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> <xi:include href="64bit-avx.xml"/> <xi:include href="64bit-mpx.xml"/> </target> diff --git a/gdb/features/i386/amd64-avx.c b/gdb/features/i386/amd64-avx.c index 42bd69ab97..61d3ff56a4 100644 --- a/gdb/features/i386/amd64-avx.c +++ b/gdb/features/i386/amd64-avx.c @@ -146,23 +146,27 @@ initialize_tdesc_amd64_avx (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); - tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128"); - tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm0h", 59, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm1h", 60, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm2h", 61, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm3h", 62, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm4h", 63, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm5h", 64, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm6h", 65, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm7h", 66, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm8h", 67, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm9h", 68, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm10h", 69, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm11h", 70, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm12h", 71, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm13h", 72, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm14h", 73, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm15h", 74, 1, NULL, 128, "uint128"); tdesc_amd64_avx = result; } diff --git a/gdb/features/i386/amd64-avx.xml b/gdb/features/i386/amd64-avx.xml index d3b63b8132..a0fec551d9 100644 --- a/gdb/features/i386/amd64-avx.xml +++ b/gdb/features/i386/amd64-avx.xml @@ -12,5 +12,6 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> <xi:include href="64bit-avx.xml"/> </target> diff --git a/gdb/features/i386/amd64-mpx.c b/gdb/features/i386/amd64-mpx.c index 41f0e7834b..026fdb8625 100644 --- a/gdb/features/i386/amd64-mpx.c +++ b/gdb/features/i386/amd64-mpx.c @@ -146,6 +146,10 @@ initialize_tdesc_amd64_mpx (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); type = tdesc_create_struct (feature, "br128"); field_type = tdesc_named_type (feature, "uint64"); @@ -177,12 +181,12 @@ initialize_tdesc_amd64_mpx (void) field_type = tdesc_named_type (feature, "_bndcfgu"); tdesc_add_field (type, "config", field_type); - tdesc_create_reg (feature, "bnd0raw", 57, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd1raw", 58, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd2raw", 59, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bnd3raw", 60, 1, NULL, 128, "br128"); - tdesc_create_reg (feature, "bndcfgu", 61, 1, NULL, 64, "cfgu"); - tdesc_create_reg (feature, "bndstatus", 62, 1, NULL, 64, "status"); + tdesc_create_reg (feature, "bnd0raw", 59, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd1raw", 60, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd2raw", 61, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd3raw", 62, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bndcfgu", 63, 1, NULL, 64, "cfgu"); + tdesc_create_reg (feature, "bndstatus", 64, 1, NULL, 64, "status"); tdesc_amd64_mpx = result; } diff --git a/gdb/features/i386/amd64-mpx.xml b/gdb/features/i386/amd64-mpx.xml index 7692006e9c..7e0253d661 100644 --- a/gdb/features/i386/amd64-mpx.xml +++ b/gdb/features/i386/amd64-mpx.xml @@ -12,5 +12,6 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> <xi:include href="64bit-mpx.xml"/> </target> diff --git a/gdb/features/i386/amd64.c b/gdb/features/i386/amd64.c index b875a9b322..31ab6ccfba 100644 --- a/gdb/features/i386/amd64.c +++ b/gdb/features/i386/amd64.c @@ -146,5 +146,9 @@ initialize_tdesc_amd64 (void) tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128"); tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr"); + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments"); + tdesc_create_reg (feature, "fs_base", 57, 1, NULL, 64, "int"); + tdesc_create_reg (feature, "gs_base", 58, 1, NULL, 64, "int"); + tdesc_amd64 = result; } diff --git a/gdb/features/i386/amd64.xml b/gdb/features/i386/amd64.xml index d11c07e234..1962a2af37 100644 --- a/gdb/features/i386/amd64.xml +++ b/gdb/features/i386/amd64.xml @@ -12,4 +12,5 @@ <architecture>i386:x86-64</architecture> <xi:include href="64bit-core.xml"/> <xi:include href="64bit-sse.xml"/> + <xi:include href="64bit-segments.xml"/> </target> diff --git a/gdb/regformats/i386/amd64-avx-avx512.dat b/gdb/regformats/i386/amd64-avx-avx512.dat index b7938e6919..1fbe4733f5 100644 --- a/gdb/regformats/i386/amd64-avx-avx512.dat +++ b/gdb/regformats/i386/amd64-avx-avx512.dat @@ -60,6 +60,8 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr +64:fs_base +64:gs_base 128:ymm0h 128:ymm1h 128:ymm2h diff --git a/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat index 88185fd8c3..23c3a4062e 100644 --- a/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat +++ b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat @@ -60,7 +60,6 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr -64:orig_rax 64:fs_base 64:gs_base 128:ymm0h diff --git a/gdb/regformats/i386/amd64-avx-mpx.dat b/gdb/regformats/i386/amd64-avx-mpx.dat index d985641b01..655775b0f9 100644 --- a/gdb/regformats/i386/amd64-avx-mpx.dat +++ b/gdb/regformats/i386/amd64-avx-mpx.dat @@ -60,6 +60,8 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr +64:fs_base +64:gs_base 128:ymm0h 128:ymm1h 128:ymm2h diff --git a/gdb/regformats/i386/amd64-avx.dat b/gdb/regformats/i386/amd64-avx.dat index 223233667a..8b9d81e743 100644 --- a/gdb/regformats/i386/amd64-avx.dat +++ b/gdb/regformats/i386/amd64-avx.dat @@ -60,6 +60,8 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr +64:fs_base +64:gs_base 128:ymm0h 128:ymm1h 128:ymm2h diff --git a/gdb/regformats/i386/amd64-mpx.dat b/gdb/regformats/i386/amd64-mpx.dat index 43b87769c2..d5e60babd8 100644 --- a/gdb/regformats/i386/amd64-mpx.dat +++ b/gdb/regformats/i386/amd64-mpx.dat @@ -60,6 +60,8 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr +64:fs_base +64:gs_base 128:bnd0raw 128:bnd1raw 128:bnd2raw diff --git a/gdb/regformats/i386/amd64.dat b/gdb/regformats/i386/amd64.dat index 0ff917019d..66f26ad094 100644 --- a/gdb/regformats/i386/amd64.dat +++ b/gdb/regformats/i386/amd64.dat @@ -60,3 +60,5 @@ expedite:rbp,rsp,rip 128:xmm14 128:xmm15 32:mxcsr +64:fs_base +64:gs_base -- 2.11.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin @ 2017-07-11 8:03 ` Yao Qi 2017-07-11 16:26 ` John Baldwin 2017-07-12 12:16 ` Phil Muldoon 0 siblings, 2 replies; 17+ messages in thread From: Yao Qi @ 2017-07-11 8:03 UTC (permalink / raw) To: John Baldwin; +Cc: gdb-patches John Baldwin <jhb@FreeBSD.org> writes: > This permits these registers to be used with non-Linux targets. Some GDBserver uses these target description files, like x86_64-*-mingw*, after this change, GDBserver will reply GDB the target description including "64bit-segments.xml". Then, GDB will request the contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml is already builtin in GDBserver, so there isn't an issue here. The patch is good to me. P.S. this is a good example to show the inflexibility in current target description. After we change it to my new approach of target description, this change will be just two or three lines :) -- Yao (齐尧) ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-11 8:03 ` Yao Qi @ 2017-07-11 16:26 ` John Baldwin 2017-07-12 12:16 ` Phil Muldoon 1 sibling, 0 replies; 17+ messages in thread From: John Baldwin @ 2017-07-11 16:26 UTC (permalink / raw) To: Yao Qi; +Cc: gdb-patches On Tuesday, July 11, 2017 09:01:25 AM Yao Qi wrote: > John Baldwin <jhb@FreeBSD.org> writes: > > > This permits these registers to be used with non-Linux targets. > > Some GDBserver uses these target description files, like > x86_64-*-mingw*, after this change, GDBserver will reply GDB the target > description including "64bit-segments.xml". Then, GDB will request the > contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml > is already builtin in GDBserver, so there isn't an issue here. > > The patch is good to me. > > P.S. this is a good example to show the inflexibility in current target > description. After we change it to my new approach of target > description, this change will be just two or three lines :) Agreed. :) The combinatorics with XSAVE on x86 is especially bad. -- John Baldwin ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-11 8:03 ` Yao Qi 2017-07-11 16:26 ` John Baldwin @ 2017-07-12 12:16 ` Phil Muldoon 2017-07-12 13:02 ` Yao Qi 1 sibling, 1 reply; 17+ messages in thread From: Phil Muldoon @ 2017-07-12 12:16 UTC (permalink / raw) To: Yao Qi, John Baldwin; +Cc: gdb-patches On 11/07/17 09:01, Yao Qi wrote: > John Baldwin <jhb@FreeBSD.org> writes: > >> This permits these registers to be used with non-Linux targets. > > Some GDBserver uses these target description files, like > x86_64-*-mingw*, after this change, GDBserver will reply GDB the target > description including "64bit-segments.xml". Then, GDB will request the > contents of 64bit-segments.xml from GDBserver, looks 64bit-segments.xml > is already builtin in GDBserver, so there isn't an issue here. > > The patch is good to me. > > P.S. this is a good example to show the inflexibility in current target > description. After we change it to my new approach of target > description, this change will be just two or three lines :) > This commit: 48aeef91c248291dd03583798904612426b1f40a along with related commit: 0aa37b654c0f31e446ab47826f0bcbec15d0112f seems to cause substantial testsuite failures for me on x8664/Fedora/Linux. Backtrace of a trivial: file helloworld (gdb) bt #0 0x0000000000937b51 in htab_remove_elt_with_hash (htab=0x133f5d0, element=0xf0a180, hash=2401929989) at ../../binutils-gdb/libiberty/hashtab.c:728 #1 0x0000000000937b1b in htab_remove_elt (htab=0x133f5d0, element=0xf0a180) at ../../binutils-gdb/libiberty/hashtab.c:714 #2 0x00000000007b7c02 in tdesc_use_registers (gdbarch=0x1346ac0, target_desc=0xf2f540, early_data=0x133f5a0) at ../../binutils-gdb/gdb/target-descriptions.c:1328 #3 0x000000000045079c in i386_gdbarch_init (info=..., arches=0x0) at ../../binutils-gdb/gdb/i386-tdep.c:8634 #4 0x00000000006be323 in gdbarch_find_by_info (info=...) at ../../binutils-gdb/gdb/gdbarch.c:5394 #5 0x00000000005bddd9 in set_gdbarch_from_file (abfd=0x133d1d0) at ../../binutils-gdb/gdb/arch-utils.c:618 #6 0x000000000069777d in exec_file_attach (filename=0x13301d0 "/home/pmuldoon/td", from_tty=1) at ../../binutils-gdb/gdb/exec.c:380 Does anyone else see this? Cheers Phil ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-12 12:16 ` Phil Muldoon @ 2017-07-12 13:02 ` Yao Qi 2017-07-12 13:51 ` Simon Marchi 2017-07-12 16:23 ` Keith Seitz 0 siblings, 2 replies; 17+ messages in thread From: Yao Qi @ 2017-07-12 13:02 UTC (permalink / raw) To: Phil Muldoon; +Cc: John Baldwin, gdb-patches On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> wrote: > > Does anyone else see this? > I don't see the issue you posted here, but there are some regressions shown in buildbot. https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html John, could you take a look? -- Yao (齐尧) ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-12 13:02 ` Yao Qi @ 2017-07-12 13:51 ` Simon Marchi 2017-07-12 20:03 ` John Baldwin 2017-07-12 16:23 ` Keith Seitz 1 sibling, 1 reply; 17+ messages in thread From: Simon Marchi @ 2017-07-12 13:51 UTC (permalink / raw) To: Yao Qi; +Cc: Phil Muldoon, John Baldwin, gdb-patches On 2017-07-12 15:02, Yao Qi wrote: > On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> > wrote: >> >> Does anyone else see this? >> > > I don't see the issue you posted here, but there are > some regressions shown in buildbot. > https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html > > John, could you take a look? I looked around, I don't know exactly what's wrong but I might have some pointers. From what I understand, tdesc_use_registers adds the registers listed in the target description to a hash table, and then removes some of those same registers that are also specified by the architecture, so it's left with the registers for which we need to assign a number. The hash table hash the pointer itself, it does not look at what it points to. I added some prints where we add and remove the registers from the htab. For rax, it looks good: ADDING 0x237a510 rax REMOVING 0x237a510 rax We add and remov the same pointer. For fs_base, the pointers are different: ADDING 0x237d840 fs_base REMOVING 0x23a5d70 fs_base It suggests that something is wrong here, I would expect those two pointers to be equal. I don't know enough about how the reg objects are created to know why it this happens. Despite that, a segfault happens when we are calling htab_remove_elt with an element that does not exist in the hash table. This case should be handled correctly, since this function allows that: 707 /* This function deletes an element with the given value from hash 708 table (the hash is computed from the element). If there is no matching 709 element in the hash table, this function does nothing. */ 710 711 void 712 htab_remove_elt (htab_t htab, PTR element) The problem seems to be in htab_remove_elt_with_hash: 727 slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT); 728 if (*slot == HTAB_EMPTY_ENTRY) 729 return; htab_find_slot_with_hash can return NULL if you pass NO_INSERT and the element is non-existent. So it looks like it's missing a slot != NULL on line 728. Hope that helps. Simon ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-12 13:51 ` Simon Marchi @ 2017-07-12 20:03 ` John Baldwin 2017-07-13 16:55 ` Yao Qi 0 siblings, 1 reply; 17+ messages in thread From: John Baldwin @ 2017-07-12 20:03 UTC (permalink / raw) To: gdb-patches, Simon Marchi; +Cc: Yao Qi, Phil Muldoon On Wednesday, July 12, 2017 03:50:58 PM Simon Marchi wrote: > On 2017-07-12 15:02, Yao Qi wrote: > > On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> > > wrote: > >> > >> Does anyone else see this? > >> > > > > I don't see the issue you posted here, but there are > > some regressions shown in buildbot. > > https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html > > > > John, could you take a look? > > I looked around, I don't know exactly what's wrong but I might have some > pointers. > > From what I understand, tdesc_use_registers adds the registers listed in > the target description to a hash table, and then removes some of those > same registers that are also specified by the architecture, so it's left > with the registers for which we need to assign a number. The hash table > hash the pointer itself, it does not look at what it points to. > > I added some prints where we add and remove the registers from the htab. > For rax, it looks good: > > ADDING 0x237a510 rax > REMOVING 0x237a510 rax > > We add and remov the same pointer. For fs_base, the pointers are > different: > > ADDING 0x237d840 fs_base > REMOVING 0x23a5d70 fs_base > > It suggests that something is wrong here, I would expect those two > pointers to be equal. I don't know enough about how the reg objects are > created to know why it this happens. I'm not sure why these should actually be equal at all. In theory we are resolving two different target descriptions which should have each called tdesc_create_reg(). I don't see anything that follows a singleton-like pattern so that if two tdesc's create the same register with the same name they point to the same 'struct tdesc_reg *' though that seems to be what is happening for other registers other than fs_base and gs_base. I noticed that amd64_init_abi() in amd64-tdep.c invokes tdesc_numbered_register earlier than is done for other registers on x86. In particular, all the other registers are "added" via tdesc_numbered_register in i386_validate_tdesc() which is called after gdbarch_init_abi() (and thus after any OS-dependent hooks have had a chance to complete). On a whim I tried deferring adding fs_base and gs_base until i386_validate_tdesc(). This does seem to fix the crash for me on a CentOS 7 VM I have lying around. The fs_base and gs_base registers still work for me on FreeBSD. They do not show up in info registers on the CentOS VM, but perhaps it is too old to have the relevant ptrace ops (I know it's too old to have the updated struct user_reg). What I don't really understand though is why this works. I also don't fully understand why 'data->arch_regs' is supposed to always hold the same pointer values as in 'target_desc' in tdesc_use_registers(). diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 9ff7dfc513..3196ef75a1 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -3061,15 +3061,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments") != NULL) { - const struct tdesc_feature *feature = - tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments"); - struct tdesc_arch_data *tdesc_data_segments = - (struct tdesc_arch_data *) info.tdep_info; - - tdesc_numbered_register (feature, tdesc_data_segments, - AMD64_FSBASE_REGNUM, "fs_base"); - tdesc_numbered_register (feature, tdesc_data_segments, - AMD64_GSBASE_REGNUM, "gs_base"); + tdep->fsbase_regnum = AMD64_FSBASE_REGNUM; } if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL) diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index bd728f03dc..1c8263cc87 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -8199,7 +8199,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep, const struct tdesc_feature *feature_core; const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx, - *feature_avx512, *feature_pkeys; + *feature_avx512, *feature_pkeys, *feature_segments; int i, num_regs, valid_p; if (! tdesc_has_registers (tdesc)) @@ -8225,6 +8225,9 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep, /* Try PKEYS */ feature_pkeys = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys"); + /* Try segment base registers. */ + feature_segments = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments"); + valid_p = 1; /* The XCR0 bits. */ @@ -8347,6 +8350,14 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep, tdep->pkeys_register_names[i]); } + if (feature_segments && tdep->fsbase_regnum >= 0) + { + valid_p &= tdesc_numbered_register (feature_segments, tdesc_data, + tdep->fsbase_regnum, "fs_base"); + valid_p &= tdesc_numbered_register (feature_segments, tdesc_data, + tdep->fsbase_regnum + 1, "gs_base"); + } + return valid_p; } @@ -8591,6 +8602,9 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->pkru_regnum = -1; tdep->num_pkeys_regs = 0; + /* No segment base registers. */ + tdep->fsbase_regnum = -1; + tdesc_data = tdesc_data_alloc (); set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction); diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h index 1ce89fcf65..a887a47752 100644 --- a/gdb/i386-tdep.h +++ b/gdb/i386-tdep.h @@ -198,6 +198,10 @@ struct gdbarch_tdep /* PKEYS register names. */ const char **pkeys_register_names; + /* Register number for %fs_base. Set this to -1 indicate the absence of + segment base registers. */ + int fsbase_regnum; + /* Target description. */ const struct target_desc *tdesc; -- John Baldwin ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-12 20:03 ` John Baldwin @ 2017-07-13 16:55 ` Yao Qi 2017-07-13 17:04 ` John Baldwin 2017-07-13 18:40 ` Pedro Alves 0 siblings, 2 replies; 17+ messages in thread From: Yao Qi @ 2017-07-13 16:55 UTC (permalink / raw) To: John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon John Baldwin <jhb@freebsd.org> writes: > I'm not sure why these should actually be equal at all. In theory we > are resolving two different target descriptions which should have each > called tdesc_create_reg(). I don't see anything that follows a > singleton-like pattern so that if two tdesc's create the same register > with the same name they point to the same 'struct tdesc_reg *' though > that seems to be what is happening for other registers other than > fs_base and gs_base. The tdesc_reg is created for each target description, so there are multiple tdesc_reg objects created. That is, the tdesc_reg of "fs_base" are different among these tdesc_amd64_*_linux. However, the tdesc_reg is a singleton in each target description. Note that we can't use singleton for each register globally, because tdesc_reg.target_regnum can be different in different target descriptions. For example, fs_base's regnum is 57 in "bare-metal" amd64 target descriptions, while it is 58 in "linux" amd64 target descriptions, because of 64bit-linux.xml. > > I noticed that amd64_init_abi() in amd64-tdep.c invokes > tdesc_numbered_register earlier than is done for other registers on x86. > In particular, all the other registers are "added" via > tdesc_numbered_register in i386_validate_tdesc() which is called after > gdbarch_init_abi() (and thus after any OS-dependent hooks have had a > chance to complete). On a whim I tried deferring adding fs_base and > gs_base until i386_validate_tdesc(). This does seem to fix the crash > for me on a CentOS 7 VM I have lying around. The fs_base and gs_base > registers still work for me on FreeBSD. They do not show up in > info registers on the CentOS VM, but perhaps it is too old to have > the relevant ptrace ops (I know it's too old to have the updated Your patch fixes the crash, but I can't see fs_base and gs_base on my machine either. > struct user_reg). What I don't really understand though is why this > works. I also don't fully understand why 'data->arch_regs' is supposed > to always hold the same pointer values as in 'target_desc' in > tdesc_use_registers(). because each tdesc_reg is a singleton among the target description. The reason Simon observed that we have different "fs_base" tdesc_reg added and removed from the hash table is that they are from different target descriptions. GDB crashes in tdesc_use_registers. The arguments tdesc and tdesc_data are not consistent, tdesc is amd64 linux target description, but tdesc_data was got when tdesc is amd64 target description, so the tdesc_reg in tdesc_data are from amd64 target description as well. So, we push a "fs_base" from one target description and want to remove a "fs_base" from another target description. Does this answer your question? I think maybe there is some "better" fix that is to keep tdesc and tdes_data consistent. However, I don't think it further. Since current GDB trunk is unusable on x86_64-linux, it is better get a fix soon. > > diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c > index 9ff7dfc513..3196ef75a1 100644 > --- a/gdb/amd64-tdep.c > +++ b/gdb/amd64-tdep.c > @@ -3061,15 +3061,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > > if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments") != NULL) > { > - const struct tdesc_feature *feature = > - tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments"); > - struct tdesc_arch_data *tdesc_data_segments = > - (struct tdesc_arch_data *) info.tdep_info; > - > - tdesc_numbered_register (feature, tdesc_data_segments, > - AMD64_FSBASE_REGNUM, "fs_base"); > - tdesc_numbered_register (feature, tdesc_data_segments, > - AMD64_GSBASE_REGNUM, "gs_base"); > + tdep->fsbase_regnum = AMD64_FSBASE_REGNUM; > } > There is one line, so braces are not needed. > if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL) > diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c > index bd728f03dc..1c8263cc87 100644 > --- a/gdb/i386-tdep.c > +++ b/gdb/i386-tdep.c > @@ -8199,7 +8199,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep, > const struct tdesc_feature *feature_core; > > const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx, > - *feature_avx512, *feature_pkeys; > + *feature_avx512, *feature_pkeys, *feature_segments; Indentation looks wrong. Did you run regression test on x86_64-linux? -- Yao (齐尧) ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-13 16:55 ` Yao Qi @ 2017-07-13 17:04 ` John Baldwin 2017-07-13 18:40 ` Pedro Alves 1 sibling, 0 replies; 17+ messages in thread From: John Baldwin @ 2017-07-13 17:04 UTC (permalink / raw) To: Yao Qi; +Cc: gdb-patches, Simon Marchi, Phil Muldoon On Thursday, July 13, 2017 05:55:06 PM Yao Qi wrote: > John Baldwin <jhb@freebsd.org> writes: > Your patch fixes the crash, but I can't see fs_base and gs_base on my > machine either. Ok. I assume yours is newer than my (ancient) VM and thus this patch doesn't work. > > struct user_reg). What I don't really understand though is why this > > works. I also don't fully understand why 'data->arch_regs' is supposed > > to always hold the same pointer values as in 'target_desc' in > > tdesc_use_registers(). > > because each tdesc_reg is a singleton among the target description. The > reason Simon observed that we have different "fs_base" tdesc_reg added > and removed from the hash table is that they are from different target > descriptions. GDB crashes in tdesc_use_registers. The arguments tdesc > and tdesc_data are not consistent, tdesc is amd64 linux target > description, but tdesc_data was got when tdesc is amd64 target > description, so the tdesc_reg in tdesc_data are from amd64 target > description as well. So, we push a "fs_base" from one target > description and want to remove a "fs_base" from another target > description. > > Does this answer your question? I think maybe there is some "better" > fix that is to keep tdesc and tdes_data consistent. However, I don't > think it further. Since current GDB trunk is unusable on x86_64-linux, > it is better get a fix soon. Ok. I think then that the hash table in tdesc_use_registers shouldn't be using the 'tdesc_reg' as the key but instead use the register name? This should be fairly simple to implement via a std::unordered_map<>. I'll try that in a bit, but if that doesn't resolve it we should revert the commits until we have a real fix. -- John Baldwin ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-13 16:55 ` Yao Qi 2017-07-13 17:04 ` John Baldwin @ 2017-07-13 18:40 ` Pedro Alves 2017-07-13 19:59 ` Pedro Alves 1 sibling, 1 reply; 17+ messages in thread From: Pedro Alves @ 2017-07-13 18:40 UTC (permalink / raw) To: Yao Qi, John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon On 07/13/2017 05:55 PM, Yao Qi wrote: > because each tdesc_reg is a singleton among the target description. The > reason Simon observed that we have different "fs_base" tdesc_reg added > and removed from the hash table is that they are from different target > descriptions. GDB crashes in tdesc_use_registers. The arguments tdesc > and tdesc_data are not consistent, tdesc is amd64 linux target > description, but tdesc_data was got when tdesc is amd64 target > description, so the tdesc_reg in tdesc_data are from amd64 target > description as well. So, we push a "fs_base" from one target > description and want to remove a "fs_base" from another target > description. > > Does this answer your question? I think maybe there is some "better" > fix that is to keep tdesc and tdes_data consistent. However, I don't > think it further. Since current GDB trunk is unusable on x86_64-linux, > it is better get a fix soon. Yeah. It seems to me that the problem is that amd64_linux_init_abi uses amd64_init_abi as helper, but they don't coordinate on which fallback tdesc to use. So amd64_init_abi does: if (! tdesc_has_registers (tdesc)) tdesc = tdesc_amd64; and creates a register in the "tdesc_amd64" architecture. and then after, amd64_linux_init_abi does: if (! tdesc_has_registers (tdesc)) tdesc = tdesc_amd64_linux; tdep->tdesc = tdesc; But when amd64_init_abi is being called as helper, it should fallback to tdesc_amd64_linux instead. Notice that amd64_linux_init_abi also calls tdesc_numbered_register, for orig_rax. So if some other foo_init_abi routine would use amd64_linux_init_abi as helper, then that tdesc_numbered_register call would be problematic in the same way. It seems to me that the proper fix is to make sure that amd64_linux_init_abi and amd64_init_abi agree. Something like this patch below. Fixes the crash for me. From d5775b549291675d9bb5c095b837eca16733aa61 Mon Sep 17 00:00:00 2001 From: Pedro Alves <palves@redhat.com> Date: Thu, 13 Jul 2017 19:09:13 +0100 Subject: [PATCH] fix --- gdb/amd64-linux-tdep.c | 9 +++------ gdb/amd64-tdep.c | 16 ++++++++-------- gdb/amd64-tdep.h | 5 ++++- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 4ef0f78..7863d58 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -1863,7 +1863,6 @@ static void amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - const struct target_desc *tdesc = info.target_desc; struct tdesc_arch_data *tdesc_data = (struct tdesc_arch_data *) info.tdep_info; const struct tdesc_feature *feature; @@ -1875,15 +1874,13 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset); tdep->sizeof_gregset = 27 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64_linux); + + const target_desc *tdesc = tdep->tdesc; /* Reserve a number for orig_rax. */ set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS); - if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_amd64_linux; - tdep->tdesc = tdesc; - feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux"); if (feature == NULL) return; diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 9ff7dfc..de89f95 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -3005,7 +3005,8 @@ static const int amd64_record_regmap[] = }; void -amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch, + target_desc *default_tdesc) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const struct target_desc *tdesc = info.target_desc; @@ -3022,7 +3023,11 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->fpregset = &amd64_fpregset; if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_amd64; + { + if (default_tdesc == NULL) + default_tdesc = tdesc_amd64; + tdesc = default_tdesc; + } tdep->tdesc = tdesc; tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS; @@ -3199,13 +3204,8 @@ void amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - const struct target_desc *tdesc = info.target_desc; - amd64_init_abi (info, gdbarch); - - if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_x32; - tdep->tdesc = tdesc; + amd64_init_abi (info, gdbarch, tdesc_x32); tdep->num_dword_regs = 17; set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type); diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h index 87f0ba3..9f946af 100644 --- a/gdb/amd64-tdep.h +++ b/gdb/amd64-tdep.h @@ -97,7 +97,10 @@ extern void amd64_displaced_step_fixup (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs); -extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch); +extern void amd64_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch, + target_desc *default_tdesc = NULL); + extern void amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch); extern const struct target_desc *amd64_target_description (uint64_t xcr0); -- 2.5.5 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-13 18:40 ` Pedro Alves @ 2017-07-13 19:59 ` Pedro Alves 0 siblings, 0 replies; 17+ messages in thread From: Pedro Alves @ 2017-07-13 19:59 UTC (permalink / raw) To: Yao Qi, John Baldwin; +Cc: gdb-patches, Simon Marchi, Phil Muldoon On 07/13/2017 07:40 PM, Pedro Alves wrote: > It seems to me that the proper fix is to make sure > that amd64_linux_init_abi and amd64_init_abi agree. Something like > this patch below. Fixes the crash for me. OK, as discussed on IRC, I've pushed this in. From c55a47e7237ebac17df73183d214d90400a49455 Mon Sep 17 00:00:00 2001 From: Pedro Alves <palves@redhat.com> Date: Thu, 13 Jul 2017 20:56:42 +0100 Subject: [PATCH] Fix x86-64 GNU/Linux crashes Ref: https://sourceware.org/ml/gdb-patches/2017-07/msg00162.html Debugging x86-64 GNU/Linux programs currently crashes GDB in tdesc_use_registers during gdbarch initialization: Program received signal SIGSEGV, Segmentation fault. 0x0000000001093eaf in htab_remove_elt_with_hash (htab=0x2ef9fa0, element=0x26af960, hash=557151073) at src/libiberty/hashtab.c:728 728 if (*slot == HTAB_EMPTY_ENTRY) (top-gdb) p slot $1 = (void **) 0x0 (top-gdb) bt #0 0x0000000001093eaf in htab_remove_elt_with_hash (htab=0x2ef9fa0, element=0x26af960, hash=557151073) at src/libiberty/hashtab.c:728 #1 0x0000000001093e79 in htab_remove_elt (htab=0x2ef9fa0, element=0x26af960) at src/libiberty/hashtab.c:714 #2 0x00000000009121b0 in tdesc_use_registers (gdbarch=0x3001240, target_desc=0x2659cb0, early_data=0x2881cb0) at src/gdb/target-descriptions.c:1328 #3 0x000000000047c93e in i386_gdbarch_init (info=..., arches=0x0) at src/gdb/i386-tdep.c:8634 #4 0x0000000000818d5f in gdbarch_find_by_info (info=...) at src/gdb/gdbarch.c:5394 #5 0x00000000007198a8 in set_gdbarch_from_file (abfd=0x2f48250) at src/gdb/arch-utils.c:618 #6 0x00000000007f21cb in exec_file_attach (filename=0x7fffffffddb0 "/home/pedro/gdb/tests/threads", from_tty=1) at src/gdb/exec.c:380 #7 0x0000000000865c18 in catch_command_errors_const (command=0x7f1d83 <exec_file_attach(char const*, int)>, arg=0x7fffffffddb0 "/home/pedro/gdb/tests/threads", from_tty=1) at src/gdb/main.c:403 #8 0x00000000008669cf in captured_main_1 (context=0x7fffffffd860) at src/gdb/main.c:1035 #9 0x0000000000866de2 in captured_main (data=0x7fffffffd860) at src/gdb/main.c:1142 #10 0x0000000000866e24 in gdb_main (args=0x7fffffffd860) at src/gdb/main.c:1160 #11 0x000000000041312d in main (argc=3, argv=0x7fffffffd968) at src/gdb/gdb.c:32 The direct cause of the crash is that we tried to remove an element from the hash which supposedly exists, but does not. (htab_remove_elt shouldn't really crash in this case, but that's secondary.) The real problem is that early_data passed to tdesc_use_registers includes regs from a target description that is not the target_desc, which violates its assumptions. The registers in question are the fs_base/gs_base registers, added by amd64_init_abi: tdesc_numbered_register (feature, tdesc_data_segments, AMD64_FSBASE_REGNUM, "fs_base"); tdesc_numbered_register (feature, tdesc_data_segments, AMD64_GSBASE_REGNUM, "gs_base"); and that happens because amd64_linux_init_abi uses amd64_init_abi as helper, but they don't coordinate on which fallback tdesc to use. amd64_init_abi does: if (! tdesc_has_registers (tdesc)) tdesc = tdesc_amd64; and then adds the fs_base/gs_base registers of the "tdesc_amd64" tdesc to the tdesc_arch_data. After amd64_init_abi returns, amd64_linux_init_abi does: if (! tdesc_has_registers (tdesc)) tdesc = tdesc_amd64_linux; tdep->tdesc = tdesc; and we end up tdesc_amd64_linux installed in tdep->tdesc. The fix is to make sure that amd64_linux_init_abi and amd64_init_abi agree on default tdesc, by adding a "default tdesc" parameter to amd64_init_abi, instead of having amd64_init_abi hardcode a default. With this, amd64_init_abi creates the fs_base/gs_base registers using the tdesc_amd64_linux tdesc. Tested on x86-64 GNU/Linux, -m64. I don't have an x32 setup handy. Thanks to John Baldwin, Yao Qi and Simon Marchi for the investigation. gdb/ChangeLog: 2017-07-13 Pedro Alves <palves@redhat.com> * amd64-darwin-tdep.c (x86_darwin_init_abi_64): Pass tdesc_amd64 as default tdesc. * amd64-dicos-tdep.c (amd64_dicos_init_abi): * amd64-fbsd-tdep.c (amd64fbsd_init_abi): * amd64-linux-tdep.c (amd64_linux_init_abi): Pass tdesc_amd64_linux as default tdesc. Get final tdesc from the tdep. (amd64_x32_linux_init_abi): Pass tdesc_x32_linux as default tdesc. Get final tdesc from the tdep. * amd64-nbsd-tdep.c (amd64nbsd_init_abi): Pass tdesc_amd64 as default tdesc. * amd64-obsd-tdep.c (amd64obsd_init_abi): Likewise. * amd64-sol2-tdep.c (amd64_sol2_init_abi): Likewise. * amd64-tdep.c (amd64_init_abi): Add 'default_tdesc' parameter. Use it as default tdesc. (amd64_x32_init_abi): Add 'default_tdesc' parameter, and pass it down to amd_init_abi. No longer handle fallback tdesc here. * amd64-tdep.h (tdesc_x32): Declare. (amd64_init_abi, amd64_x32_init_abi): Add 'default_tdesc' parameter. * amd64-windows-tdep.c (amd64_windows_init_abi): Pass tdesc_amd64 as default tdesc. --- gdb/ChangeLog | 25 +++++++++++++++++++++++++ gdb/amd64-darwin-tdep.c | 2 +- gdb/amd64-dicos-tdep.c | 2 +- gdb/amd64-fbsd-tdep.c | 2 +- gdb/amd64-linux-tdep.c | 16 +++++----------- gdb/amd64-nbsd-tdep.c | 2 +- gdb/amd64-obsd-tdep.c | 2 +- gdb/amd64-sol2-tdep.c | 2 +- gdb/amd64-tdep.c | 15 ++++++--------- gdb/amd64-tdep.h | 13 +++++++++++-- gdb/amd64-windows-tdep.c | 2 +- 11 files changed, 54 insertions(+), 29 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 37fe06e..3210957 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,28 @@ +2017-07-13 Pedro Alves <palves@redhat.com> + + * amd64-darwin-tdep.c (x86_darwin_init_abi_64): Pass tdesc_amd64 + as default tdesc. + * amd64-dicos-tdep.c (amd64_dicos_init_abi): + * amd64-fbsd-tdep.c (amd64fbsd_init_abi): + * amd64-linux-tdep.c (amd64_linux_init_abi): Pass + tdesc_amd64_linux as default tdesc. Get final tdesc from the + tdep. + (amd64_x32_linux_init_abi): Pass tdesc_x32_linux as default tdesc. + Get final tdesc from the tdep. + * amd64-nbsd-tdep.c (amd64nbsd_init_abi): Pass tdesc_amd64 as + default tdesc. + * amd64-obsd-tdep.c (amd64obsd_init_abi): Likewise. + * amd64-sol2-tdep.c (amd64_sol2_init_abi): Likewise. + * amd64-tdep.c (amd64_init_abi): Add 'default_tdesc' parameter. + Use it as default tdesc. + (amd64_x32_init_abi): Add 'default_tdesc' parameter, and pass it + down to amd_init_abi. No longer handle fallback tdesc here. + * amd64-tdep.h (tdesc_x32): Declare. + (amd64_init_abi, amd64_x32_init_abi): Add 'default_tdesc' + parameter. + * amd64-windows-tdep.c (amd64_windows_init_abi): Pass tdesc_amd64 + as default tdesc. + 2017-07-13 Andreas Arnez <arnez@linux.vnet.ibm.com> * s390-linux-tdep.c (s390_process_record): Add support for diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c index db400cd..be26d9e 100644 --- a/gdb/amd64-darwin-tdep.c +++ b/gdb/amd64-darwin-tdep.c @@ -99,7 +99,7 @@ x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); tdep->struct_return = reg_struct_return; diff --git a/gdb/amd64-dicos-tdep.c b/gdb/amd64-dicos-tdep.c index ee40891..7bdb167 100644 --- a/gdb/amd64-dicos-tdep.c +++ b/gdb/amd64-dicos-tdep.c @@ -25,7 +25,7 @@ static void amd64_dicos_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); dicos_init_abi (gdbarch); } diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c index 48bb209..ad4d787 100644 --- a/gdb/amd64-fbsd-tdep.c +++ b/gdb/amd64-fbsd-tdep.c @@ -217,7 +217,7 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64fbsd_r_reg_offset); tdep->sizeof_gregset = 22 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); tdep->sigtramp_p = amd64fbsd_sigtramp_p; tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr; diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 4ef0f78..cf24789 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -1863,7 +1863,6 @@ static void amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - const struct target_desc *tdesc = info.target_desc; struct tdesc_arch_data *tdesc_data = (struct tdesc_arch_data *) info.tdep_info; const struct tdesc_feature *feature; @@ -1875,15 +1874,13 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset); tdep->sizeof_gregset = 27 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64_linux); + + const target_desc *tdesc = tdep->tdesc; /* Reserve a number for orig_rax. */ set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS); - if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_amd64_linux; - tdep->tdesc = tdesc; - feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux"); if (feature == NULL) return; @@ -2080,7 +2077,6 @@ static void amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - const struct target_desc *tdesc = info.target_desc; struct tdesc_arch_data *tdesc_data = (struct tdesc_arch_data *) info.tdep_info; const struct tdesc_feature *feature; @@ -2092,14 +2088,12 @@ amd64_x32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset); tdep->sizeof_gregset = 27 * 8; - amd64_x32_init_abi (info, gdbarch); + amd64_x32_init_abi (info, gdbarch, tdesc_x32_linux); /* Reserve a number for orig_rax. */ set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS); - if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_x32_linux; - tdep->tdesc = tdesc; + const target_desc *tdesc = tdep->tdesc; feature = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.linux"); if (feature == NULL) diff --git a/gdb/amd64-nbsd-tdep.c b/gdb/amd64-nbsd-tdep.c index db6f19f..02bf427 100644 --- a/gdb/amd64-nbsd-tdep.c +++ b/gdb/amd64-nbsd-tdep.c @@ -103,7 +103,7 @@ amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset); tdep->sizeof_gregset = 26 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); tdep->jb_pc_offset = 7 * 8; diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c index 72895b6..ad90c20 100644 --- a/gdb/amd64-obsd-tdep.c +++ b/gdb/amd64-obsd-tdep.c @@ -419,7 +419,7 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); obsd_init_abi (info, gdbarch); /* Initialize general-purpose register set details. */ diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c index 51fe9db..ca474db 100644 --- a/gdb/amd64-sol2-tdep.c +++ b/gdb/amd64-sol2-tdep.c @@ -99,7 +99,7 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset); tdep->sizeof_gregset = 28 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); tdep->sigtramp_p = amd64_sol2_sigtramp_p; tdep->sigcontext_addr = amd64_sol2_mcontext_addr; diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 9ff7dfc..6171bc5 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -3005,7 +3005,8 @@ static const int amd64_record_regmap[] = }; void -amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch, + target_desc *default_tdesc) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const struct target_desc *tdesc = info.target_desc; @@ -3022,7 +3023,7 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->fpregset = &amd64_fpregset; if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_amd64; + tdesc = default_tdesc; tdep->tdesc = tdesc; tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS; @@ -3196,16 +3197,12 @@ amd64_x32_pseudo_register_type (struct gdbarch *gdbarch, int regnum) } void -amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch, + target_desc *default_tdesc) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - const struct target_desc *tdesc = info.target_desc; - - amd64_init_abi (info, gdbarch); - if (! tdesc_has_registers (tdesc)) - tdesc = tdesc_x32; - tdep->tdesc = tdesc; + amd64_init_abi (info, gdbarch, default_tdesc); tdep->num_dword_regs = 17; set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type); diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h index 87f0ba3..d4c6c9a 100644 --- a/gdb/amd64-tdep.h +++ b/gdb/amd64-tdep.h @@ -88,6 +88,7 @@ enum amd64_regnum #define AMD64_NUM_REGS (AMD64_GSBASE_REGNUM + 1) extern struct target_desc *tdesc_amd64; +extern struct target_desc *tdesc_x32; extern struct displaced_step_closure *amd64_displaced_step_copy_insn (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, @@ -97,9 +98,17 @@ extern void amd64_displaced_step_fixup (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs); -extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch); +/* Initialize the ABI for amd64. Uses DEFAULT_TDESC as fallback + tdesc, if INFO does not specify one. */ +extern void amd64_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch, + target_desc *default_tdesc); + +/* Initialize the ABI for x32. Uses DEFAULT_TDESC as fallback tdesc, + if INFO does not specify one. */ extern void amd64_x32_init_abi (struct gdbarch_info info, - struct gdbarch *gdbarch); + struct gdbarch *gdbarch, + target_desc *default_tdesc); extern const struct target_desc *amd64_target_description (uint64_t xcr0); /* Fill register REGNUM in REGCACHE with the appropriate diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c index f1acdb9..9158282 100644 --- a/gdb/amd64-windows-tdep.c +++ b/gdb/amd64-windows-tdep.c @@ -1224,7 +1224,7 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) */ frame_unwind_append_unwinder (gdbarch, &amd64_windows_frame_unwind); - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, tdesc_amd64); windows_init_abi (info, gdbarch); -- 2.5.5 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions. 2017-07-12 13:02 ` Yao Qi 2017-07-12 13:51 ` Simon Marchi @ 2017-07-12 16:23 ` Keith Seitz 1 sibling, 0 replies; 17+ messages in thread From: Keith Seitz @ 2017-07-12 16:23 UTC (permalink / raw) To: gdb-patches; +Cc: Phil Muldoon, John Baldwin On 07/12/2017 06:02 AM, Yao Qi wrote: > On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> wrote: >> >> Does anyone else see this? >> Yes, I do, too -- I ran into it yesterday while rebasing patches for posting. FWIW, buildbot sees it, too (snippet from x86_64/-m32 linux): set architecture i386:x64-32 ERROR: Process no longer exists UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32: endian=auto: set architecture i386:x64-32 ERROR: Couldn't send set endian auto to GDB. UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: set endian ERROR: Couldn't send set architecture i386:x64-32:intel to GDB. UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: set architecture i386:x64-32:intel ERROR: Couldn't send show endian to GDB. UNRESOLVED: gdb.base/all-architectures-2.exp: tests: osabi=GNU/Linux: arch=i386:x64-32:intel: endian=auto: show endian ERROR: Couldn't send ptype 1.0L to GDB. ... In fact right now, HEAD is unusable: $ ./gdb gdb Segmentation fault $ ./gdb --version | head -1 GNU gdb (GDB) 8.0.50.20170711-git > I don't see the issue you posted here, but there are > some regressions shown in buildbot. > https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html > > John, could you take a look? I'm not normally one to suggest this, but I think this is an exceptional case. Please consider reverting this patch until this issue is resolved. Keith ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes. 2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin 2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin @ 2017-06-27 22:51 ` John Baldwin 2017-07-11 8:09 ` Yao Qi 2017-07-11 7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi 2 siblings, 1 reply; 17+ messages in thread From: John Baldwin @ 2017-06-27 22:51 UTC (permalink / raw) To: gdb-patches Use ptrace operations to fetch and store the fs_base and gs_base registers for FreeBSD/amd64 processes. Note that FreeBSD does not currently store the value of these registers in core dumps, so these registers are only available when inspecting a running process. gdb/ChangeLog: * amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use PT_GETFSBASE and PT_GETGSBASE. (amd64bsd_store_inferior_registers): Use PT_SETFSBASE and PT_SETGSBASE. --- gdb/ChangeLog | 7 +++++++ gdb/amd64-bsd-nat.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2196419fa3..09fe66a49a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2017-06-26 John Baldwin <jhb@FreeBSD.org> + * amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use + PT_GETFSBASE and PT_GETGSBASE. + (amd64bsd_store_inferior_registers): Use PT_SETFSBASE and + PT_SETGSBASE. + +2017-06-26 John Baldwin <jhb@FreeBSD.org> + * features/Makefile (amd64.dat, amd64-avx.dat, amd64-mpx.dat) (amd64-avx-mpx.dat, amd64-avx-avx512.dat) (amd64-avx-mpx-avx512-pku.dat): Add i386/64bit-segments.xml in diff --git a/gdb/amd64-bsd-nat.c b/gdb/amd64-bsd-nat.c index ca61a3551b..41dee84269 100644 --- a/gdb/amd64-bsd-nat.c +++ b/gdb/amd64-bsd-nat.c @@ -57,6 +57,33 @@ amd64bsd_fetch_inferior_registers (struct target_ops *ops, return; } +#ifdef PT_GETFSBASE + if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM) + { + register_t base; + + if (ptrace (PT_GETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) + perror_with_name (_("Couldn't get segment register fs_base")); + + regcache_raw_supply (regcache, AMD64_FSBASE_REGNUM, &base); + if (regnum != -1) + return; + } +#endif +#ifdef PT_GETGSBASE + if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM) + { + register_t base; + + if (ptrace (PT_GETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) + perror_with_name (_("Couldn't get segment register gs_base")); + + regcache_raw_supply (regcache, AMD64_GSBASE_REGNUM, &base); + if (regnum != -1) + return; + } +#endif + if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct fpreg fpregs; @@ -108,6 +135,33 @@ amd64bsd_store_inferior_registers (struct target_ops *ops, return; } +#ifdef PT_SETFSBASE + if (regnum == -1 || regnum == AMD64_FSBASE_REGNUM) + { + register_t base; + + regcache_raw_collect (regcache, AMD64_FSBASE_REGNUM, &base); + + if (ptrace (PT_SETFSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) + perror_with_name (_("Couldn't write segment register fs_base")); + if (regnum != -1) + return; + } +#endif +#ifdef PT_SETGSBASE + if (regnum == -1 || regnum == AMD64_GSBASE_REGNUM) + { + register_t base; + + regcache_raw_collect (regcache, AMD64_GSBASE_REGNUM, &base); + + if (ptrace (PT_SETGSBASE, pid, (PTRACE_TYPE_ARG3) &base, 0) == -1) + perror_with_name (_("Couldn't write segment register gs_base")); + if (regnum != -1) + return; + } +#endif + if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct fpreg fpregs; -- 2.11.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes. 2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin @ 2017-07-11 8:09 ` Yao Qi 0 siblings, 0 replies; 17+ messages in thread From: Yao Qi @ 2017-07-11 8:09 UTC (permalink / raw) To: John Baldwin; +Cc: gdb-patches John Baldwin <jhb@FreeBSD.org> writes: > Use ptrace operations to fetch and store the fs_base and gs_base registers > for FreeBSD/amd64 processes. Note that FreeBSD does not currently store the > value of these registers in core dumps, so these registers are only > available when inspecting a running process. > > gdb/ChangeLog: > > * amd64-bsd-nat.c (amd64bsd_fetch_inferior_registers): Use > PT_GETFSBASE and PT_GETGSBASE. > (amd64bsd_store_inferior_registers): Use PT_SETFSBASE and > PT_SETGSBASE. The patch is good to me. -- Yao (齐尧) ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin 2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin 2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin @ 2017-07-11 7:49 ` Yao Qi 2017-07-11 16:26 ` John Baldwin 2 siblings, 1 reply; 17+ messages in thread From: Yao Qi @ 2017-07-11 7:49 UTC (permalink / raw) To: John Baldwin; +Cc: gdb-patches John Baldwin <jhb@FreeBSD.org> writes: > On the other hand, I wonder if we shouldn't just add fs_base and gs_base > to the "core" descriptions alongside "fs" and "gs" rather than using a > separate feature if they are always going to be present. The feature org.gnu.gdb.i386.core and org.gnu.gdb.i386.segments are already explicitly documented https://sourceware.org/gdb/current/onlinedocs/gdb/i386-Features.html I don't think we can modify org.gnu.gdb.i386.core. -- Yao (齐尧) ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 2017-07-11 7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi @ 2017-07-11 16:26 ` John Baldwin 0 siblings, 0 replies; 17+ messages in thread From: John Baldwin @ 2017-07-11 16:26 UTC (permalink / raw) To: Yao Qi; +Cc: gdb-patches On Tuesday, July 11, 2017 08:48:32 AM Yao Qi wrote: > John Baldwin <jhb@FreeBSD.org> writes: > > > On the other hand, I wonder if we shouldn't just add fs_base and gs_base > > to the "core" descriptions alongside "fs" and "gs" rather than using a > > separate feature if they are always going to be present. > > The feature org.gnu.gdb.i386.core and org.gnu.gdb.i386.segments are > already explicitly documented > https://sourceware.org/gdb/current/onlinedocs/gdb/i386-Features.html > I don't think we can modify org.gnu.gdb.i386.core. Ok. -- John Baldwin ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2017-07-13 19:59 UTC | newest] Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-06-27 22:50 [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 John Baldwin 2017-06-27 22:51 ` [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions John Baldwin 2017-07-11 8:03 ` Yao Qi 2017-07-11 16:26 ` John Baldwin 2017-07-12 12:16 ` Phil Muldoon 2017-07-12 13:02 ` Yao Qi 2017-07-12 13:51 ` Simon Marchi 2017-07-12 20:03 ` John Baldwin 2017-07-13 16:55 ` Yao Qi 2017-07-13 17:04 ` John Baldwin 2017-07-13 18:40 ` Pedro Alves 2017-07-13 19:59 ` Pedro Alves 2017-07-12 16:23 ` Keith Seitz 2017-06-27 22:51 ` [PATCH 2/2] Support the fs_base and gs_base registers on FreeBSD/amd64 native processes John Baldwin 2017-07-11 8:09 ` Yao Qi 2017-07-11 7:49 ` [PATCH 0/2] Support fs_base and gs_base for native FreeBSD/amd64 Yao Qi 2017-07-11 16:26 ` John Baldwin
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 read-only IMAP folder(s) and NNTP newsgroup(s).