Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/44146 )

Change subject: arch-x86: Rework the ACPI object interfaces.
......................................................................

arch-x86: Rework the ACPI object interfaces.

Change-Id: I1ee08854d1c81925e4da145bf4c9bd3cefc7458a
---
M src/arch/x86/bios/acpi.cc
M src/arch/x86/bios/acpi.hh
2 files changed, 204 insertions(+), 249 deletions(-)



diff --git a/src/arch/x86/bios/acpi.cc b/src/arch/x86/bios/acpi.cc
index 2946392..035ae97 100644
--- a/src/arch/x86/bios/acpi.cc
+++ b/src/arch/x86/bios/acpi.cc
@@ -43,17 +43,6 @@
 #include "base/trace.hh"
 #include "mem/port.hh"
 #include "mem/port_proxy.hh"
-#include "params/X86ACPIMadt.hh"
-#include "params/X86ACPIMadtIOAPIC.hh"
-#include "params/X86ACPIMadtIntSourceOverride.hh"
-#include "params/X86ACPIMadtLAPIC.hh"
-#include "params/X86ACPIMadtLAPICOverride.hh"
-#include "params/X86ACPIMadtNMI.hh"
-#include "params/X86ACPIMadtRecord.hh"
-#include "params/X86ACPIRSDP.hh"
-#include "params/X86ACPIRSDT.hh"
-#include "params/X86ACPISysDescTable.hh"
-#include "params/X86ACPIXSDT.hh"
 #include "sim/byteswap.hh"
 #include "sim/sim_object.hh"

@@ -92,38 +81,34 @@
     SimObject(p),
     rsdt(p.rsdt),
     xsdt(p.xsdt)
-{
-    static_assert(sizeof(signature) - 1 == sizeof(_data.signature),
-            "signature length mismatch");
-    std::memcpy(_data.signature, signature, sizeof(_data.signature));
-    std::strncpy(_data.oemID, p.oem_id.c_str(), sizeof(_data.oemID));
-    _data.revision = p.revision;
-    _data.length = sizeof(_data);
-}
+{}

 Addr
 RSDP::write(PortProxy& phys_proxy, Allocator& alloc) const
 {
-    std::vector<uint8_t> mem(sizeof(_data));
-    Addr addr = alloc.alloc(sizeof(_data), 16);
+    std::vector<uint8_t> mem(sizeof(Mem));
+    Addr addr = alloc.alloc(mem.size(), 16);

-    assert(mem.size() >= sizeof(_data));
-    std::memcpy(mem.data(), &_data, sizeof(_data));
-    Mem* desc = (Mem*)mem.data();
+    Mem* data = (Mem*)mem.data();
+    static_assert(sizeof(signature) - 1 == sizeof(data->signature),
+            "signature length mismatch");
+    std::memcpy(data->signature, signature, sizeof(data->signature));
+ std::strncpy(data->oemID, params().oem_id.c_str(), sizeof(data->oemID));
+    data->revision = params().revision;
+    data->length = mem.size();

     if (rsdt) {
-        desc->rsdtAddress = rsdt->write(phys_proxy, alloc);
-        DPRINTF(ACPI, "Allocated RSDT @ %llx\n", desc->rsdtAddress);
+        data->rsdtAddress = rsdt->write(phys_proxy, alloc);
+        DPRINTF(ACPI, "Allocated RSDT @ %llx\n", data->rsdtAddress);
     }
     if (xsdt) {
-        desc->xsdtAddress = xsdt->write(phys_proxy, alloc);
-        DPRINTF(ACPI, "Allocated XSDT @ %llx\n", desc->xsdtAddress);
+        data->xsdtAddress = xsdt->write(phys_proxy, alloc);
+        DPRINTF(ACPI, "Allocated XSDT @ %llx\n", data->xsdtAddress);
     }

     // checksum calculation
-    assert(_data.length == sizeof(_data));
-    desc->checksum = apic_checksum(mem.data(), sizeof(MemR0));
-    desc->extendedChecksum = apic_checksum(mem.data(), _data.length);
+    data->checksum = apic_checksum(mem.data(), sizeof(MemR0));
+    data->extendedChecksum = apic_checksum(mem.data(), mem.size());

     // write the whole thing
     phys_proxy.writeBlob(addr, mem.data(), mem.size());
@@ -131,50 +116,37 @@
     return addr;
 }

-SysDescTable::Mem::Mem(const char* _signature, uint8_t _revision,
-        const Params& p) :
-    revision(_revision)
-{
-    std::strncpy(signature, _signature, sizeof(signature));
-    std::strncpy(oemID, p.oem_id.c_str(), sizeof(oemID));
-    std::strncpy(oemTableID, p.oem_table_id.c_str(), sizeof(oemTableID));
-    oemRevision = p.oem_revision;
-    creatorID = p.creator_id;
-    creatorRevision = p.creator_revision;
-}
-
-void
-SysDescTable::prepare_self(std::vector<uint8_t>& mem) const
-{
-    Mem const* d;
-    std::size_t size;
-    std::tie(d, size) = data();
-    mem.resize(size);
-    std::memcpy(mem.data(), d, size);
-}
-
 Addr
-SysDescTable::prepare(std::vector<uint8_t>& mem,
-        PortProxy& phys_proxy, Allocator& alloc) const
+SysDescTable::writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+        std::vector<uint8_t> &mem) const
 {
-    prepare_self(mem);
-    return alloc.alloc(mem.size());
-}
+ // An empty SysDescTable doesn't make any sense, so assert that somebody
+    // else allocated a large enough blob.
+    assert(!mem.empty());

-Addr
-SysDescTable::write(PortProxy& phys_proxy, Allocator& alloc) const
-{
-    std::vector<uint8_t> mem;
+    // Allocate a place to write this blob.
+    Addr addr = alloc.alloc(mem.size());

-    // prepare data
-    Addr addr = prepare(mem, phys_proxy, alloc);
+    DPRINTF(ACPI, "Writing system description table [%llx - %llx]\n", addr,
+            addr + mem.size());

-    // checksum calculation
+    // Fill in the header.
+    auto& p = params();
     Mem* header = (Mem*)mem.data();
+    std::strncpy(header->signature, signature, sizeof(header->signature));
     header->length = mem.size();
+    header->revision = revision;
+    std::strncpy(header->oemID, p.oem_id.c_str(), sizeof(header->oemID));
+    std::strncpy(header->oemTableID, p.oem_table_id.c_str(),
+            sizeof(header->oemTableID));
+    header->oemRevision = p.oem_revision;
+    header->creatorID = p.creator_id;
+    header->creatorRevision = p.creator_revision;
+
+    // Update checksum.
     header->checksum = apic_checksum(mem.data(), mem.size());

-    // write to physical memory
+    // Write to memory.
     phys_proxy.writeBlob(addr, mem.data(), mem.size());

     return addr;
@@ -182,48 +154,43 @@

 //// RSDT, XSDT
 template<class T>
-RXSDT<T>::RXSDT(const Params& p, const char * _signature, uint8_t _revision) :
-    SysDescTable(p),
-    _data(_signature, _revision, p)
+RXSDT<T>::RXSDT(const Params& p, const char *_signature, uint8_t _revision) :
+    SysDescTable(p, _signature, _revision)
 {}

 template<class T>
-std::tuple<SysDescTable::Mem const*, std::size_t>
-RXSDT<T>::data() const
-{
-    return std::make_tuple(&_data, sizeof(_data));
-}
-
-template<class T>
 Addr
-RXSDT<T>::prepare(std::vector<uint8_t>& mem,
-        PortProxy& phys_proxy, Allocator& alloc) const
+RXSDT<T>::writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+        std::vector<uint8_t>& mem) const
 {
-    prepare_self(mem);
+ // Since this table ends with a variably sized array, it can't be extended
+    // by another table type.
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
     auto base_size = mem.size();
     mem.resize(base_size + sizeof(Ptr) * entries.size());
-    Addr addr = alloc.alloc(mem.size());
+
     Ptr* ptr_array = reinterpret_cast<Ptr*>(mem.data() + base_size);
-    DPRINTF(ACPI, "RXSDT: writing %d entries @ %llx (ptr size: %d)\n",
-            entries.size(), addr, sizeof(Ptr));
-    for (unsigned i = 0; i < entries.size(); ++i) {
-        Addr entry_addr = entries[i]->write(phys_proxy, alloc);
+ DPRINTF(ACPI, "RXSDT: Writing %d entries (ptr size: %d)\n", entries.size(),
+            sizeof(Ptr));
+    for (const auto *entry : entries) {
+        Addr entry_addr = entry->write(phys_proxy, alloc);
         fatal_if((entry_addr & mask(sizeof(Ptr) * 8)) != entry_addr,
                 "RXSDT: Entry address doesn't fit in pointer type.");
         DPRINTF(ACPI, "RXSDT: wrote entry @ %llx\n", entry_addr);
-        ptr_array[i] = entry_addr;
+        *ptr_array++ = entry_addr;
     }
-    return addr;
+
+    return SysDescTable::writeBuf(phys_proxy, alloc, mem);
 }

-RSDT::RSDT(const Params& p) :
-    RXSDT(p, "RSDT", 1)
+RSDT::RSDT(const Params& p) : RXSDT(p, "RSDT", 1)
 {
     entries = p.entries;
 }

-XSDT::XSDT(const Params& p) :
-    RXSDT(p, "XSDT", 1)
+XSDT::XSDT(const Params& p) : RXSDT(p, "XSDT", 1)
 {
     entries = p.entries;
 }
@@ -231,91 +198,114 @@

 //// MADT
 MADT::MADT::MADT(const Params& p) :
-    SysDescTable(p),
-    records(p.records),
-    _data("APIC", 4, p)
-{
-    _data.localAPICAddress = p.local_apic_address;
-    _data.flags = p.flags;
-}
+    SysDescTable(p, "APIC", 4),
+    records(p.records)
+{}

-std::tuple<SysDescTable::Mem const*, std::size_t>
-MADT::MADT::data() const
+Addr
+MADT::MADT::writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+        std::vector<uint8_t>& mem) const
 {
-    return std::make_tuple(&_data, sizeof(_data));
-}
+ // Since this table ends with a variably sized array, it can't be extended
+    // by another table type.
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));

-void
-MADT::MADT::prepare_self(std::vector<uint8_t>& mem) const
-{
-    // header
-    SysDescTable::prepare_self(mem);
-    auto base_size = mem.size();
+    Mem* header = reinterpret_cast<Mem*>(mem.data());
+    header->localAPICAddress = params().local_apic_address;
+    header->flags = params().flags;

-    // size of header and records
-    std::size_t record_size = 0;
-    for (auto const& record : records) {
-        assert(record->size() > 0);
-        record_size += record->size();
+    for (const auto& record : records) {
+        auto entry = record->prepare();
+        mem.insert(mem.end(), entry.begin(), entry.end());
     }
-    mem.resize(base_size + record_size);

-    // records
-    auto p = mem.data() + base_size;
     DPRINTF(ACPI, "MADT: writing %d records (size: %d)\n",
             records.size(), mem.size());
-    for (auto const& record : records) {
-        assert(p < mem.data() + mem.size());
-        record->write(p);
-        p += record->size();
-    }
+
+    return SysDescTable::writeBuf(phys_proxy, alloc, mem);
 }

 void
-MADT::Record::write(uint8_t* mem) const
+MADT::Record::prepareBuf(std::vector<uint8_t>& mem) const
 {
+    assert(!mem.empty());
     DPRINTF(ACPI, "MADT: writing record type %d (size: %d)\n",
-            data().type, data().length);
-    std::memcpy(mem, &data(), size());
+            type, mem.size());
+
+    Mem* header = reinterpret_cast<Mem*>(mem.data());
+    header->type = type;
+    header->length = mem.size();
 }

-MADT::LAPIC::LAPIC(const Params& p) :
-    Record(p)
+void
+MADT::LAPIC::prepareBuf(std::vector<uint8_t>& mem) const
 {
-    d.acpiProcessorId = p.acpi_processor_id;
-    d.apicId = p.apic_id;
-    d.flags = p.flags;
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
+    Mem* data = reinterpret_cast<Mem*>(mem.data());
+    data->acpiProcessorId = params().acpi_processor_id;
+    data->apicId = params().apic_id;
+    data->flags = params().flags;
+
+    Record::prepareBuf(mem);
 }

-MADT::IOAPIC::IOAPIC(const Params& p) :
-    Record(p)
+void
+MADT::IOAPIC::prepareBuf(std::vector<uint8_t>& mem) const
 {
-    d.ioApicId = p.id;
-    d.ioApicAddress = p.address;
-    d.intBase = p.int_base;
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
+    Mem* data = reinterpret_cast<Mem*>(mem.data());
+    data->ioApicId = params().id;
+    data->ioApicAddress = params().address;
+    data->intBase = params().int_base;
+
+    Record::prepareBuf(mem);
 }

-MADT::IntSourceOverride::IntSourceOverride(const Params& p) :
-    Record(p)
+void
+MADT::IntSourceOverride::prepareBuf(std::vector<uint8_t>& mem) const
 {
-    d.busSource = p.bus_source;
-    d.irqSource = p.irq_source;
-    d.globalSystemInterrupt = p.sys_int;
-    d.flags = p.flags;
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
+    Mem* data = reinterpret_cast<Mem*>(mem.data());
+    data->busSource = params().bus_source;
+    data->irqSource = params().irq_source;
+    data->globalSystemInterrupt = params().sys_int;
+    data->flags = params().flags;
+
+    Record::prepareBuf(mem);
 }

-MADT::NMI::NMI(const Params& p) :
-    Record(p)
+void
+MADT::NMI::prepareBuf(std::vector<uint8_t>& mem) const
 {
-    d.acpiProcessorId = p.acpi_processor_id;
-    d.flags = p.flags;
-    d.lintNo = p.lint_no;
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
+    Mem* data = reinterpret_cast<Mem*>(mem.data());
+    data->acpiProcessorId = params().acpi_processor_id;
+    // The "flags" field is not properly aligned.
+    memcpy(&data->flags, &params().flags, sizeof(data->flags));
+    data->lintNo = params().lint_no;
+
+    Record::prepareBuf(mem);
 }

-MADT::LAPICOverride::LAPICOverride(const Params& p) :
-    Record(p)
+void
+MADT::LAPICOverride::prepareBuf(std::vector<uint8_t>& mem) const
 {
-    d.localAPICAddress = p.address;
+    assert(mem.empty());
+    mem.resize(sizeof(Mem));
+
+    Mem* data = reinterpret_cast<Mem*>(mem.data());
+    data->localAPICAddress = params().address;
+
+    Record::prepareBuf(mem);
 }

 } // namespace ACPI
diff --git a/src/arch/x86/bios/acpi.hh b/src/arch/x86/bios/acpi.hh
index bb1d905..cc0c93e 100644
--- a/src/arch/x86/bios/acpi.hh
+++ b/src/arch/x86/bios/acpi.hh
@@ -46,24 +46,21 @@
 #include "base/compiler.hh"
 #include "base/types.hh"
 #include "debug/ACPI.hh"
+#include "params/X86ACPIMadt.hh"
+#include "params/X86ACPIMadtIOAPIC.hh"
+#include "params/X86ACPIMadtIntSourceOverride.hh"
+#include "params/X86ACPIMadtLAPIC.hh"
+#include "params/X86ACPIMadtLAPICOverride.hh"
+#include "params/X86ACPIMadtNMI.hh"
+#include "params/X86ACPIMadtRecord.hh"
+#include "params/X86ACPIRSDP.hh"
+#include "params/X86ACPIRSDT.hh"
+#include "params/X86ACPISysDescTable.hh"
+#include "params/X86ACPIXSDT.hh"
 #include "sim/sim_object.hh"

-class Port;
 class PortProxy;

-struct X86ACPIRSDPParams;
-
-struct X86ACPISysDescTableParams;
-struct X86ACPIRSDTParams;
-struct X86ACPIXSDTParams;
-struct X86ACPIMadtParams;
-struct X86ACPIMadtRecordParams;
-struct X86ACPIMadtLAPICParams;
-struct X86ACPIMadtIOAPICParams;
-struct X86ACPIMadtIntSourceOverrideParams;
-struct X86ACPIMadtNMIParams;
-struct X86ACPIMadtLAPICOverrideParams;
-
 namespace X86ISA
 {

@@ -72,7 +69,6 @@

 class RSDT;
 class XSDT;
-class SysDescTable;

 struct Allocator
 {
@@ -95,7 +91,7 @@
 class RSDP : public SimObject
 {
   protected:
-    typedef X86ACPIRSDPParams Params;
+    PARAMS(X86ACPIRSDP);

     static const char signature[];

@@ -122,11 +118,6 @@
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy,");

-    Mem _data;
-
-    std::string oemID;
-    uint8_t revision;
-
     RSDT* rsdt;
     XSDT* xsdt;

@@ -139,7 +130,7 @@
 class SysDescTable : public SimObject
 {
   protected:
-    typedef X86ACPISysDescTableParams Params;
+    PARAMS(X86ACPISysDescTable);

     struct M5_ATTR_PACKED Mem
     {
@@ -153,22 +144,27 @@
         uint32_t oemRevision = 0;
         uint32_t creatorID = 0;
         uint32_t creatorRevision = 0;
-
-        Mem(char const* signature, uint8_t revision, const Params& p);
     };
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    virtual void prepare_self(std::vector<uint8_t>& mem) const;
-    virtual Addr prepare(std::vector<uint8_t>& mem,
-        PortProxy& physProxy, Allocator& alloc) const;
+    virtual Addr writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+            std::vector<uint8_t>& mem) const;

-    virtual std::tuple<Mem const*, std::size_t> data() const = 0;
+    const char* signature;
+    uint8_t revision;
+
+ SysDescTable(const Params& p, const char* _signature, uint8_t _revision) :
+        SimObject(p), signature(_signature), revision(_revision)
+    {}

   public:
-    using SimObject::SimObject;
-
-    Addr write(PortProxy& phys_proxy, Allocator& alloc) const;
+    Addr
+    write(PortProxy& phys_proxy, Allocator& alloc) const
+    {
+        std::vector<uint8_t> mem;
+        return writeBuf(phys_proxy, alloc, mem);
+    }
 };

 template<class T>
@@ -179,15 +175,8 @@

     std::vector<SysDescTable *> entries;

-    Addr prepare(std::vector<uint8_t>& mem,
-        PortProxy& phys_proxy, Allocator& alloc) const override;
-
-    std::tuple<Mem const*, std::size_t> data() const override;
-
-  private:
-    SysDescTable::Mem _data;
-    static_assert(std::is_trivially_copyable<decltype(_data)>::value,
-            "Type not suitable for memcpy.");
+    Addr writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+            std::vector<uint8_t>& mem) const override;

   protected:
     RXSDT(const Params& p, const char* _signature, uint8_t _revision);
@@ -196,7 +185,7 @@
 class RSDT : public RXSDT<uint32_t>
 {
   protected:
-    typedef X86ACPIRSDTParams Params;
+    PARAMS(X86ACPIRSDT);

   public:
     RSDT(const Params &p);
@@ -205,7 +194,7 @@
 class XSDT : public RXSDT<uint64_t>
 {
   protected:
-    typedef X86ACPIXSDTParams Params;
+    PARAMS(X86ACPIXSDT);

   public:
     XSDT(const Params &p);
@@ -216,38 +205,39 @@
 class Record : public SimObject
 {
   protected:
-    typedef X86ACPIMadtRecordParams Params;
+    PARAMS(X86ACPIMadtRecord);

     struct M5_ATTR_PACKED Mem
     {
-        uint8_t type;
+        uint8_t type = 0;
         uint8_t length = 0;
-
-        Mem(uint8_t _type, uint8_t _length) :
-            type(_type),
-            length(_length)
-        {}
     };
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    virtual Mem const& data() const = 0;
+    uint8_t type;
+
+    virtual void prepareBuf(std::vector<uint8_t>& mem) const;

   public:
-    using SimObject::SimObject;
+    Record(const Params& p, uint8_t _type) : SimObject(p), type(_type) {}

-    std::size_t size() const { return data().length; }
-    void write(uint8_t* mem) const;
+    std::vector<uint8_t>
+    prepare() const
+    {
+        std::vector<uint8_t> mem;
+        prepareBuf(mem);
+        return mem;
+    }
 };

 class LAPIC : public Record
 {
   protected:
-    typedef X86ACPIMadtLAPICParams Params;
+    PARAMS(X86ACPIMadtLAPIC);
+
     struct M5_ATTR_PACKED Mem : public Record::Mem
     {
-        Mem() : Record::Mem(0, sizeof(Mem)) {}
-
         uint8_t acpiProcessorId = 0;
         uint8_t apicId = 0;
         uint32_t flags = 0;
@@ -255,23 +245,19 @@
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    Record::Mem const& data() const override { return d; }
-
-  private:
-    Mem d;
+    void prepareBuf(std::vector<uint8_t>& mem) const override;

   public:
-    LAPIC(const Params& p);
+    LAPIC(const Params& p) : Record(p, 0) {}
 };

 class IOAPIC : public Record
 {
   protected:
-    typedef X86ACPIMadtIOAPICParams Params;
+    PARAMS(X86ACPIMadtIOAPIC);
+
     struct M5_ATTR_PACKED Mem : public Record::Mem
     {
-        Mem() : Record::Mem(1, sizeof(Mem)) {}
-
         uint8_t ioApicId = 0;
         uint8_t _reserved = 0;
         uint32_t ioApicAddress = 0;
@@ -280,23 +266,19 @@
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    Record::Mem const& data() const override { return d; }
-
-  private:
-    Mem d;
+    void prepareBuf(std::vector<uint8_t>& mem) const override;

   public:
-    IOAPIC(const Params& p);
+    IOAPIC(const Params& p) : Record(p, 1) {}
 };

 class IntSourceOverride : public Record
 {
   protected:
-    typedef X86ACPIMadtIntSourceOverrideParams Params;
+    PARAMS(X86ACPIMadtIntSourceOverride);
+
     struct M5_ATTR_PACKED Mem : public Record::Mem
     {
-        Mem() : Record::Mem(2, sizeof(Mem)) {}
-
         uint8_t busSource = 0;
         uint8_t irqSource = 0;
         uint32_t globalSystemInterrupt = 0;
@@ -305,23 +287,19 @@
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    Record::Mem const& data() const override { return d; }
-
-  private:
-    Mem d;
+    void prepareBuf(std::vector<uint8_t>& mem) const override;

   public:
-    IntSourceOverride(const Params& p);
+    IntSourceOverride(const Params& p) : Record(p, 2) {}
 };

 class NMI : public Record
 {
   protected:
-    typedef X86ACPIMadtNMIParams Params;
+    PARAMS(X86ACPIMadtNMI);
+
     struct M5_ATTR_PACKED Mem : public Record::Mem
     {
-        Mem() : Record::Mem(3, sizeof(Mem)) {}
-
         uint8_t acpiProcessorId = 0;
         uint16_t flags = 0;
         uint8_t lintNo = 0;
@@ -329,61 +307,48 @@
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    Record::Mem const& data() const override { return d; }
-
-  private:
-    Mem d;
+    void prepareBuf(std::vector<uint8_t>& mem) const override;

   public:
-    NMI(const Params& p);
+    NMI(const Params& p) : Record(p, 3) {}
 };

 class LAPICOverride : public Record
 {
   protected:
-    typedef X86ACPIMadtLAPICOverrideParams Params;
+    PARAMS(X86ACPIMadtLAPICOverride);
+
     struct M5_ATTR_PACKED Mem : public Record::Mem
     {
-        Mem() : Record::Mem(5, sizeof(Mem)) {}
-
         uint16_t _reserved = 0;
         uint64_t localAPICAddress = 0;
     };
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

-    Record::Mem const& data() const override { return d; }
-
-  private:
-    Mem d;
+    void prepareBuf(std::vector<uint8_t>& mem) const override;

   public:
-    LAPICOverride(const Params& p);
+    LAPICOverride(const Params& p) : Record(p, 5) {}
 };

 class MADT : public SysDescTable
 {
   protected:
-    typedef X86ACPIMadtParams Params;
+    PARAMS(X86ACPIMadt);

     struct M5_ATTR_PACKED Mem : public SysDescTable::Mem
     {
         uint32_t localAPICAddress = 0;
         uint32_t flags = 0;
-
-        using SysDescTable::Mem::Mem;
     };
     static_assert(std::is_trivially_copyable<Mem>::value,
             "Type not suitable for memcpy.");

     std::vector<Record *> records;

-    void prepare_self(std::vector<uint8_t>& mem) const override;
-
- std::tuple<SysDescTable::Mem const*, std::size_t> data() const override;
-
-  private:
-    Mem _data;
+    Addr writeBuf(PortProxy& phys_proxy, Allocator& alloc,
+            std::vector<uint8_t>& mem) const override;

   public:
     MADT(const Params &p);

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/44146
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I1ee08854d1c81925e4da145bf4c9bd3cefc7458a
Gerrit-Change-Number: 44146
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to