// See LICENSE for license details. #ifndef _RISCV_CFG_H #define _RISCV_CFG_H #include #include #include "decode.h" #include typedef enum { endianness_little, endianness_big } endianness_t; template class cfg_arg_t { public: cfg_arg_t(T default_val) : value(default_val), was_set(false) {} bool overridden() const { return was_set; } T operator()() const { return value; } T operator=(const T v) { value = v; was_set = true; return value; } private: T value; bool was_set; }; // Configuration that describes a memory region class mem_cfg_t { public: static bool check_if_supported(reg_t base, reg_t size); mem_cfg_t(reg_t base, reg_t size); reg_t get_base() const { return base; } reg_t get_size() const { return size; } reg_t get_inclusive_end() const { return base + size - 1; } private: reg_t base; reg_t size; }; class cfg_t { public: cfg_t(); std::pair initrd_bounds; const char * bootargs; const char * isa; const char * priv; bool misaligned; endianness_t endianness; reg_t pmpregions; reg_t pmpgranularity; std::vector mem_layout; std::optional start_pc; std::vector hartids; bool explicit_hartids; bool real_time_clint; reg_t trigger_count; size_t nprocs() const { return hartids.size(); } size_t max_hartid() const { return hartids.back(); } }; #endif