1 /* Common target-dependent functionality for RISC-V 2 3 Copyright (C) 2018-2020 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifndef ARCH_RISCV_H 21 #define ARCH_RISCV_H 22 23 #include "gdbsupport/tdesc.h" 24 25 /* The set of RISC-V architectural features that we track that impact how 26 we configure the actual gdbarch instance. We hold one of these in the 27 gdbarch_tdep structure, and use it to distinguish between different 28 RISC-V gdbarch instances. 29 30 The information in here ideally comes from the target description, 31 however, if the target doesn't provide a target description then we will 32 create a default target description by first populating one of these 33 based on what we know about the binary being executed, and using that to 34 drive default target description creation. */ 35 36 struct riscv_gdbarch_features 37 { 38 /* The size of the x-registers in bytes. This is either 4 (RV32), 8 39 (RV64), or 16 (RV128). No other value is valid. Initialise to the 40 invalid 0 value so we can spot if one of these is used 41 uninitialised. */ 42 int xlen = 0; 43 44 /* The size of the f-registers in bytes. This is either 4 (RV32), 8 45 (RV64), or 16 (RV128). This can also hold the value 0 to indicate 46 that there are no f-registers. No other value is valid. */ 47 int flen = 0; 48 49 /* Equality operator. */ 50 bool operator== (const struct riscv_gdbarch_features &rhs) const 51 { 52 return (xlen == rhs.xlen && flen == rhs.flen); 53 } 54 55 /* Inequality operator. */ 56 bool operator!= (const struct riscv_gdbarch_features &rhs) const 57 { 58 return !((*this) == rhs); 59 } 60 61 /* Used by std::unordered_map to hash feature sets. */ 62 std::size_t hash () const noexcept 63 { 64 std::size_t val = ((xlen & 0x1f) << 5 | (flen & 0x1f) << 0); 65 return val; 66 } 67 }; 68 69 #ifdef GDBSERVER 70 71 /* Create and return a target description that is compatible with FEATURES. 72 This is only used directly from the gdbserver where the created target 73 description is modified after it is return. */ 74 75 target_desc *riscv_create_target_description 76 (const struct riscv_gdbarch_features features); 77 78 #else 79 80 /* Lookup an already existing target description matching FEATURES, or 81 create a new target description if this is the first time we have seen 82 FEATURES. For the same FEATURES the same target_desc is always 83 returned. This is important when trying to lookup gdbarch objects as 84 GDBARCH_LIST_LOOKUP_BY_INFO performs a pointer comparison on target 85 descriptions to find candidate gdbarch objects. */ 86 87 const target_desc *riscv_lookup_target_description 88 (const struct riscv_gdbarch_features features); 89 90 #endif /* GDBSERVER */ 91 92 93 #endif /* ARCH_RISCV_H */ 94