X86: Make the e820 table manually or automatically configurable from python.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:58:36 +0000 (00:58 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:58:36 +0000 (00:58 -0400)
configs/common/FSConfig.py
src/arch/x86/SConscript
src/arch/x86/X86System.py
src/arch/x86/bios/E820.py [new file with mode: 0644]
src/arch/x86/bios/e820.cc [new file with mode: 0644]
src/arch/x86/bios/e820.hh [new file with mode: 0644]
src/arch/x86/linux/system.cc
src/arch/x86/linux/system.hh

index 369d845c1c569c8c36bbfc77f181b32f5f36d3db..1c33b6b2a66ea7841b5740d78a86ff7ce859aec9 100644 (file)
@@ -168,9 +168,25 @@ def makeLinuxX86System(mem_mode, mdesc = None):
 
     # Physical memory
     self.membus = Bus(bus_id=1)
-    self.physmem = PhysicalMemory(range = AddrRange('4GB')) #range = AddrRange(mdesc.mem()))
+    self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
     self.physmem.port = self.membus.port
 
+    # We assume below that there's at least 1MB of memory. We'll require 2
+    # just to avoid corner cases.
+    assert(self.physmem.range.second >= 0x200000)
+
+    # Mark the first megabyte of memory as reserved
+    self.e820_table.entries.append(X86E820Entry(
+                addr = 0,
+                size = '1MB',
+                range_type = 2))
+
+    # Mark the rest as available
+    self.e820_table.entries.append(X86E820Entry(
+                addr = 0x100000,
+                size = '%dB' % (self.physmem.range.second - 0x100000 - 1),
+                range_type = 1))
+
     # North Bridge
     self.iobus = Bus(bus_id=0)
     self.bridge = Bridge(delay='50ns', nack_delay='4ns')
index 09967b0d318a6e2b96ec12d4e26fdf6c58e0dc9d..184bb4809cfc41c30c0433d4eedc95ac38cae865 100644 (file)
@@ -110,8 +110,10 @@ if env['TARGET_ISA'] == 'x86':
 
     if env['FULL_SYSTEM']:
         SimObject('X86System.py')
+        SimObject('bios/E820.py')
 
         # Full-system sources
+        Source('bios/e820.cc')
         Source('linux/system.cc')
         Source('pagetable_walker.cc')
        Source('smbios.cc')
index f73764540b8d39d79e41f725169d5d6059679136..b4ec393c3956add1cbc7a50088f4277a8bbbf006 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -54,6 +54,7 @@
 # Authors: Gabe Black
 
 from m5.params import *
+from E820 import X86E820Table, X86E820Entry
 from System import System
 
 class X86System(System):
@@ -61,3 +62,6 @@ class X86System(System):
 
 class LinuxX86System(X86System):
     type = 'LinuxX86System'
+
+    e820_table = Param.X86E820Table(
+            X86E820Table(), 'E820 map of physical memory')
diff --git a/src/arch/x86/bios/E820.py b/src/arch/x86/bios/E820.py
new file mode 100644 (file)
index 0000000..e161cd5
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright (c) 2008 The Hewlett-Packard Development Company
+# All rights reserved.
+#
+# Redistribution and use of this software in source and binary forms,
+# with or without modification, are permitted provided that the
+# following conditions are met:
+#
+# The software must be used only for Non-Commercial Use which means any
+# use which is NOT directed to receiving any direct monetary
+# compensation for, or commercial advantage from such use.  Illustrative
+# examples of non-commercial use are academic research, personal study,
+# teaching, education and corporate research & development.
+# Illustrative examples of commercial use are distributing products for
+# commercial advantage and providing services using the software for
+# commercial advantage.
+#
+# If you wish to use this software or functionality therein that may be
+# covered by patents for commercial use, please contact:
+#     Director of Intellectual Property Licensing
+#     Office of Strategy and Technology
+#     Hewlett-Packard Company
+#     1501 Page Mill Road
+#     Palo Alto, California  94304
+#
+# Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.  Redistributions
+# in binary form must reproduce the above copyright notice, this list of
+# conditions and the following disclaimer in the documentation and/or
+# other materials provided with the distribution.  Neither the name of
+# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.  No right of
+# sublicense is granted herewith.  Derivatives of the software and
+# output created using the software may be prepared, but only for
+# Non-Commercial Uses.  Derivatives of the software may be shared with
+# others provided: (i) the others agree to abide by the list of
+# conditions herein which includes the Non-Commercial Use restrictions;
+# and (ii) such Derivatives of the software include the above copyright
+# notice to acknowledge the contribution from this software where
+# applicable, this list of conditions and the disclaimer below.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Gabe Black
+
+from m5.params import *
+from m5.SimObject import SimObject
+
+class X86E820Entry(SimObject):
+    type = 'X86E820Entry'
+    cxx_namespace = 'X86ISA'
+    cxx_class = 'E820Entry'
+
+    addr = Param.Addr(0, 'address of the beginning of the region')
+    size = Param.MemorySize('0B', 'size of the region')
+    range_type = Param.UInt64('type of the region')
+
+class X86E820Table(SimObject):
+    type = 'X86E820Table'
+    cxx_namespace = 'X86ISA'
+    cxx_class = 'E820Table'
+
+    entries = VectorParam.X86E820Entry([], 'entries for the e820 table')
diff --git a/src/arch/x86/bios/e820.cc b/src/arch/x86/bios/e820.cc
new file mode 100644 (file)
index 0000000..47adb70
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2008 The Hewlett-Packard Development Company
+ * All rights reserved.
+ *
+ * Redistribution and use of this software in source and binary forms,
+ * with or without modification, are permitted provided that the
+ * following conditions are met:
+ *
+ * The software must be used only for Non-Commercial Use which means any
+ * use which is NOT directed to receiving any direct monetary
+ * compensation for, or commercial advantage from such use.  Illustrative
+ * examples of non-commercial use are academic research, personal study,
+ * teaching, education and corporate research & development.
+ * Illustrative examples of commercial use are distributing products for
+ * commercial advantage and providing services using the software for
+ * commercial advantage.
+ *
+ * If you wish to use this software or functionality therein that may be
+ * covered by patents for commercial use, please contact:
+ *     Director of Intellectual Property Licensing
+ *     Office of Strategy and Technology
+ *     Hewlett-Packard Company
+ *     1501 Page Mill Road
+ *     Palo Alto, California  94304
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.  Redistributions
+ * in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.  Neither the name of
+ * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.  No right of
+ * sublicense is granted herewith.  Derivatives of the software and
+ * output created using the software may be prepared, but only for
+ * Non-Commercial Uses.  Derivatives of the software may be shared with
+ * others provided: (i) the others agree to abide by the list of
+ * conditions herein which includes the Non-Commercial Use restrictions;
+ * and (ii) such Derivatives of the software include the above copyright
+ * notice to acknowledge the contribution from this software where
+ * applicable, this list of conditions and the disclaimer below.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#include "arch/x86/bios/e820.hh"
+#include "arch/x86/isa_traits.hh"
+#include "mem/port.hh"
+#include "sim/byteswap.hh"
+
+using namespace std;
+using namespace X86ISA;
+
+template<class T>
+void writeVal(T val, Port * port, Addr &addr)
+{
+    T guestVal = htog(val);
+    port->writeBlob(addr, (uint8_t *)&guestVal, sizeof(T));
+    addr += sizeof(T);
+}
+
+void X86ISA::E820Table::writeTo(Port * port, Addr countAddr, Addr addr)
+{
+    uint8_t e820Nr = entries.size();
+
+    // Make sure the number of entries isn't bigger than what the kernel
+    // would be capable of handling.
+    assert(e820Nr <= 128);
+
+    uint8_t guestE820Nr = htog(e820Nr);
+
+    port->writeBlob(countAddr, (uint8_t *)&guestE820Nr, sizeof(guestE820Nr));
+
+    for (int i = 0; i < e820Nr; i++) {
+        writeVal(entries[i]->addr, port, addr);
+        writeVal(entries[i]->size, port, addr);
+        writeVal(entries[i]->type, port, addr);
+    }
+}
+
+E820Table *
+X86E820TableParams::create()
+{
+    return new E820Table(this);
+}
+
+E820Entry *
+X86E820EntryParams::create()
+{
+    return new E820Entry(this);
+}
diff --git a/src/arch/x86/bios/e820.hh b/src/arch/x86/bios/e820.hh
new file mode 100644 (file)
index 0000000..da73834
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2008 The Hewlett-Packard Development Company
+ * All rights reserved.
+ *
+ * Redistribution and use of this software in source and binary forms,
+ * with or without modification, are permitted provided that the
+ * following conditions are met:
+ *
+ * The software must be used only for Non-Commercial Use which means any
+ * use which is NOT directed to receiving any direct monetary
+ * compensation for, or commercial advantage from such use.  Illustrative
+ * examples of non-commercial use are academic research, personal study,
+ * teaching, education and corporate research & development.
+ * Illustrative examples of commercial use are distributing products for
+ * commercial advantage and providing services using the software for
+ * commercial advantage.
+ *
+ * If you wish to use this software or functionality therein that may be
+ * covered by patents for commercial use, please contact:
+ *     Director of Intellectual Property Licensing
+ *     Office of Strategy and Technology
+ *     Hewlett-Packard Company
+ *     1501 Page Mill Road
+ *     Palo Alto, California  94304
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.  Redistributions
+ * in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.  Neither the name of
+ * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.  No right of
+ * sublicense is granted herewith.  Derivatives of the software and
+ * output created using the software may be prepared, but only for
+ * Non-Commercial Uses.  Derivatives of the software may be shared with
+ * others provided: (i) the others agree to abide by the list of
+ * conditions herein which includes the Non-Commercial Use restrictions;
+ * and (ii) such Derivatives of the software include the above copyright
+ * notice to acknowledge the contribution from this software where
+ * applicable, this list of conditions and the disclaimer below.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#ifndef __ARCH_X86_BIOS_E820_HH__
+#define __ARCH_X86_BIOS_E820_HH__
+
+#include "params/X86E820Entry.hh"
+#include "params/X86E820Table.hh"
+#include "sim/host.hh"
+#include "sim/sim_object.hh"
+
+#include <vector>
+
+class Port;
+
+namespace X86ISA
+{
+    class E820Entry : public SimObject
+    {
+      public:
+        Addr addr;
+        Addr size;
+        uint32_t type;
+
+      public:
+        typedef X86E820EntryParams Params;
+        E820Entry(Params *p) :
+            SimObject(p), addr(p->addr), size(p->size), type(p->range_type)
+        {}
+    };
+
+    class E820Table : public SimObject
+    {
+      public:
+        std::vector<E820Entry *> entries;
+
+      public:
+        typedef X86E820TableParams Params;
+        E820Table(Params *p) : SimObject(p), entries(p->entries)
+        {}
+
+        void writeTo(Port * port, Addr countAddr, Addr addr);
+    };
+};
+
+#endif // __ARCH_X86_BIOS_E820_HH__
index 944bb2930d4fcf7018e7482e02c2e117d0a3f71f..c2d9cb35c7a31ad7110bb3079c29efdef51148ca 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 The Hewlett-Packard Development Company
+ * Copyright (c) 2007-2008 The Hewlett-Packard Development Company
  * All rights reserved.
  *
  * Redistribution and use of this software in source and binary forms,
@@ -68,7 +68,7 @@ using namespace LittleEndianGuest;
 using namespace X86ISA;
 
 LinuxX86System::LinuxX86System(Params *p)
-    : X86System(p), commandLine(p->boot_osflags)
+    : X86System(p), commandLine(p->boot_osflags), e820Table(p->e820_table)
 {
 }
 
@@ -144,62 +144,7 @@ LinuxX86System::startup()
     // A pointer to the buffer for E820 entries.
     const Addr e820MapPointer = realModeData + 0x2d0;
 
-    struct e820Entry
-    {
-        Addr addr;
-        Addr size;
-        uint32_t type;
-    };
-
-    // The size is computed this way to ensure no padding sneaks in.
-    int e820EntrySize =
-        sizeof(e820Entry().addr) +
-        sizeof(e820Entry().size) +
-        sizeof(e820Entry().type);
-
-    // I'm not sure what these should actually be. On a real machine they
-    // would be generated by the BIOS, and they need to reflect the regions
-    // which are actually available/reserved. These values are copied from
-    // my development machine.
-    e820Entry e820Map[] = {
-        {ULL(0x0), ULL(0x9d400), 1},
-        {ULL(0x9d400), ULL(0xa0000) - ULL(0x9d400), 2},
-        {ULL(0xe8000), ULL(0x100000) - ULL(0xe8000), 2},
-        {ULL(0x100000), ULL(0xcfff9300) - ULL(0x100000), 1},
-        {ULL(0xcfff9300), ULL(0xd0000000) - ULL(0xcfff9300), 2},
-        {ULL(0xfec00000), ULL(0x100000000) - ULL(0xfec00000), 2}
-    };
-
-    uint8_t e820Nr = sizeof(e820Map) / sizeof(e820Entry);
-
-    // Make sure the number of entries isn't bigger than what the kernel
-    // would be capable of providing.
-    assert(e820Nr <= 128);
-
-    uint8_t guestE820Nr = X86ISA::htog(e820Nr);
-    physPort->writeBlob(e820MapNrPointer,
-            (uint8_t *)&guestE820Nr, sizeof(guestE820Nr));
-
-    for (int i = 0; i < e820Nr; i++) {
-        e820Entry guestE820Entry;
-        guestE820Entry.addr = X86ISA::htog(e820Map[i].addr);
-        guestE820Entry.size = X86ISA::htog(e820Map[i].size);
-        guestE820Entry.type = X86ISA::htog(e820Map[i].type);
-        physPort->writeBlob(e820MapPointer + e820EntrySize * i,
-                (uint8_t *)&guestE820Entry.addr,
-                sizeof(guestE820Entry.addr));
-        physPort->writeBlob(
-                e820MapPointer + e820EntrySize * i +
-                    sizeof(guestE820Entry.addr),
-                (uint8_t *)&guestE820Entry.size,
-                sizeof(guestE820Entry.size));
-        physPort->writeBlob(
-                e820MapPointer + e820EntrySize * i +
-                    sizeof(guestE820Entry.addr) +
-                    sizeof(guestE820Entry.size),
-                (uint8_t *)&guestE820Entry.type,
-                sizeof(guestE820Entry.type));
-    }
+    e820Table->writeTo(physPort, e820MapNrPointer, e820MapPointer);
 
     /*
      * Pass the location of the real mode data structure to the kernel
index fc725ad45f2f6d112e5f67be83c1d58760309111..a9c5f4ca9b7294385f03b19132ede4b26df1c969 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007 The Hewlett-Packard Development Company
+ * Copyright (c) 2007-2008 The Hewlett-Packard Development Company
  * All rights reserved.
  *
  * Redistribution and use of this software in source and binary forms,
 #include <vector>
 
 #include "params/LinuxX86System.hh"
+#include "arch/x86/bios/e820.hh"
 #include "arch/x86/system.hh"
 
 class LinuxX86System : public X86System
 {
   protected:
     std::string commandLine;
+    X86ISA::E820Table * e820Table;
 
   public:
     typedef LinuxX86SystemParams Params;