From f4b581f2d1ac69c27a06a328e11763b44544aadb Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Thu, 22 Sep 2022 12:53:33 +0100 Subject: [PATCH] [AArch64] Update FPSR/FPCR fields for FPU and SVE I noticed some missing flags/fields from FPSR and FPCR registers in both the FPU and SVE target descriptions. This patch adds those and makes the SVE versions of FPSR and FPCR use the proper flags/bitfields types. --- gdb/features/aarch64-fpu.c | 3 +++ gdb/features/aarch64-fpu.xml | 14 +++++++++++++ gdb/features/aarch64-sve.c | 38 ++++++++++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/gdb/features/aarch64-fpu.c b/gdb/features/aarch64-fpu.c index a80b7d4c1b8..27e75524cfe 100644 --- a/gdb/features/aarch64-fpu.c +++ b/gdb/features/aarch64-fpu.c @@ -126,8 +126,11 @@ create_feature_aarch64_fpu (struct target_desc *result, long regnum) tdesc_add_flag (type_with_fields, 10, "OFE"); tdesc_add_flag (type_with_fields, 11, "UFE"); tdesc_add_flag (type_with_fields, 12, "IXE"); + tdesc_add_flag (type_with_fields, 13, "EBF"); tdesc_add_flag (type_with_fields, 15, "IDE"); + tdesc_add_bitfield (type_with_fields, "Len", 16, 18); tdesc_add_flag (type_with_fields, 19, "FZ16"); + tdesc_add_bitfield (type_with_fields, "Stride", 20, 21); tdesc_add_bitfield (type_with_fields, "RMode", 22, 23); tdesc_add_flag (type_with_fields, 24, "FZ"); tdesc_add_flag (type_with_fields, 25, "DN"); diff --git a/gdb/features/aarch64-fpu.xml b/gdb/features/aarch64-fpu.xml index 4db5c50f250..89bbcc0a855 100644 --- a/gdb/features/aarch64-fpu.xml +++ b/gdb/features/aarch64-fpu.xml @@ -142,11 +142,25 @@ + + + + + + diff --git a/gdb/features/aarch64-sve.c b/gdb/features/aarch64-sve.c index 54182e85090..fe25f812afc 100644 --- a/gdb/features/aarch64-sve.c +++ b/gdb/features/aarch64-sve.c @@ -121,6 +121,40 @@ create_feature_aarch64_sve (struct target_desc *result, long regnum, field_type = tdesc_named_type (feature, "uint8"); tdesc_create_vector (feature, "svep", field_type, 2 * scale); + /* FPSR register type */ + type_with_fields = tdesc_create_flags (feature, "fpsr_flags", 4); + tdesc_add_flag (type_with_fields, 0, "IOC"); + tdesc_add_flag (type_with_fields, 1, "DZC"); + tdesc_add_flag (type_with_fields, 2, "OFC"); + tdesc_add_flag (type_with_fields, 3, "UFC"); + tdesc_add_flag (type_with_fields, 4, "IXC"); + tdesc_add_flag (type_with_fields, 7, "IDC"); + tdesc_add_flag (type_with_fields, 27, "QC"); + tdesc_add_flag (type_with_fields, 28, "V"); + tdesc_add_flag (type_with_fields, 29, "C"); + tdesc_add_flag (type_with_fields, 30, "Z"); + tdesc_add_flag (type_with_fields, 31, "N"); + + /* FPCR register type */ + type_with_fields = tdesc_create_flags (feature, "fpcr_flags", 4); + tdesc_add_flag (type_with_fields, 0, "FIZ"); + tdesc_add_flag (type_with_fields, 1, "AH"); + tdesc_add_flag (type_with_fields, 2, "NEP"); + tdesc_add_flag (type_with_fields, 8, "IOE"); + tdesc_add_flag (type_with_fields, 9, "DZE"); + tdesc_add_flag (type_with_fields, 10, "OFE"); + tdesc_add_flag (type_with_fields, 11, "UFE"); + tdesc_add_flag (type_with_fields, 12, "IXE"); + tdesc_add_flag (type_with_fields, 13, "EBF"); + tdesc_add_flag (type_with_fields, 15, "IDE"); + tdesc_add_bitfield (type_with_fields, "Len", 16, 18); + tdesc_add_flag (type_with_fields, 19, "FZ16"); + tdesc_add_bitfield (type_with_fields, "Stride", 20, 21); + tdesc_add_bitfield (type_with_fields, "RMode", 22, 23); + tdesc_add_flag (type_with_fields, 24, "FZ"); + tdesc_add_flag (type_with_fields, 25, "DN"); + tdesc_add_flag (type_with_fields, 26, "AHP"); + tdesc_create_reg (feature, "z0", regnum++, 1, NULL, 128 * scale, "svev"); tdesc_create_reg (feature, "z1", regnum++, 1, NULL, 128 * scale, "svev"); tdesc_create_reg (feature, "z2", regnum++, 1, NULL, 128 * scale, "svev"); @@ -153,8 +187,8 @@ create_feature_aarch64_sve (struct target_desc *result, long regnum, tdesc_create_reg (feature, "z29", regnum++, 1, NULL, 128 * scale, "svev"); tdesc_create_reg (feature, "z30", regnum++, 1, NULL, 128 * scale, "svev"); tdesc_create_reg (feature, "z31", regnum++, 1, NULL, 128 * scale, "svev"); - tdesc_create_reg (feature, "fpsr", regnum++, 1, NULL, 32, "int"); - tdesc_create_reg (feature, "fpcr", regnum++, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "fpsr", regnum++, 1, NULL, 32, "fpsr_flags"); + tdesc_create_reg (feature, "fpcr", regnum++, 1, NULL, 32, "fpcr_flags"); tdesc_create_reg (feature, "p0", regnum++, 1, NULL, 16 * scale, "svep"); tdesc_create_reg (feature, "p1", regnum++, 1, NULL, 16 * scale, "svep"); tdesc_create_reg (feature, "p2", regnum++, 1, NULL, 16 * scale, "svep"); -- 2.30.2