Browse Source

Don't include built-in devices in mmio_device_map

Only use mmio_device_map for plugin devices.

This fixes a collision caused by multiple static initializers if Spike
depends on a library that depends on libriscv.so.
pull/2042/head
Andrew Waterman 8 months ago
parent
commit
8da8b6a34d
  1. 7
      riscv/abstract_device.h
  2. 2
      riscv/clint.cc
  3. 2
      riscv/ns16550.cc
  4. 2
      riscv/plic.cc

7
riscv/abstract_device.h

@ -46,4 +46,11 @@ mmio_device_map_t& mmio_device_map();
std::string generate_dts(const sim_t* sim, const std::vector<std::string>& sargs) const override { return generate(sim, sargs); } \
}; device_factory_t *name##_factory = new name##_factory_t();
#define REGISTER_BUILTIN_DEVICE(name, parse, generate) \
class name##_factory_t : public device_factory_t { \
public: \
name##_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, const std::vector<std::string>& sargs) const override { return parse(fdt, sim, base, sargs); } \
std::string generate_dts(const sim_t* sim, const std::vector<std::string>& sargs) const override { return generate(sim, sargs); } \
}; device_factory_t *name##_factory = new name##_factory_t();
#endif

2
riscv/clint.cc

@ -145,4 +145,4 @@ std::string clint_generate_dts(const sim_t* sim, const std::vector<std::string>&
return s.str();
}
REGISTER_DEVICE(clint, clint_parse_from_fdt, clint_generate_dts)
REGISTER_BUILTIN_DEVICE(clint, clint_parse_from_fdt, clint_generate_dts)

2
riscv/ns16550.cc

@ -361,4 +361,4 @@ ns16550_t* ns16550_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base
}
}
REGISTER_DEVICE(ns16550, ns16550_parse_from_fdt, ns16550_generate_dts)
REGISTER_BUILTIN_DEVICE(ns16550, ns16550_parse_from_fdt, ns16550_generate_dts)

2
riscv/plic.cc

@ -436,4 +436,4 @@ plic_t* plic_parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base, cons
return nullptr;
}
REGISTER_DEVICE(plic, plic_parse_from_fdt, plic_generate_dts)
REGISTER_BUILTIN_DEVICE(plic, plic_parse_from_fdt, plic_generate_dts)

Loading…
Cancel
Save