diff options
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/pagetable.hh | 85 | ||||
-rw-r--r-- | src/arch/x86/pagetable_walker.cc | 17 | ||||
-rw-r--r-- | src/arch/x86/process.hh | 9 | ||||
-rw-r--r-- | src/arch/x86/system.hh | 14 |
4 files changed, 108 insertions, 17 deletions
diff --git a/src/arch/x86/pagetable.hh b/src/arch/x86/pagetable.hh index 2a7ade853..86e488bdc 100644 --- a/src/arch/x86/pagetable.hh +++ b/src/arch/x86/pagetable.hh @@ -1,4 +1,5 @@ /* + * Copyright (c) 2014 Advanced Micro Devices, Inc. * Copyright (c) 2007 The Hewlett-Packard Development Company * All rights reserved. * @@ -42,11 +43,15 @@ #include <iostream> #include <string> +#include <vector> #include "base/bitunion.hh" #include "base/misc.hh" #include "base/types.hh" #include "base/trie.hh" +#include "cpu/thread_context.hh" +#include "arch/x86/system.hh" +#include "debug/MMU.hh" class Checkpoint; @@ -73,6 +78,25 @@ namespace X86ISA Bitfield<31, 22> norml2; EndBitUnion(VAddr) + // Unfortunately, the placement of the base field in a page table entry is + // very erratic and would make a mess here. It might be moved here at some + // point in the future. + BitUnion64(PageTableEntry) + Bitfield<63> nx; + Bitfield<51, 12> base; + Bitfield<11, 9> avl; + Bitfield<8> g; + Bitfield<7> ps; + Bitfield<6> d; + Bitfield<5> a; + Bitfield<4> pcd; + Bitfield<3> pwt; + Bitfield<2> u; + Bitfield<1> w; + Bitfield<0> p; + EndBitUnion(PageTableEntry) + + struct TlbEntry { // The base of the physical page. @@ -127,6 +151,67 @@ namespace X86ISA void serialize(std::ostream &os); void unserialize(Checkpoint *cp, const std::string §ion); }; + + /** The size of each level of the page table expressed in base 2 + * logarithmic values + */ + const std::vector<uint8_t> PageTableLayout = {9, 9, 9, 9}; + + enum PTEField{ + PTE_NotPresent = 0, + PTE_Present, + PTE_ReadOnly = 0, + PTE_ReadWrite, + PTE_Supervisor = 0, + PTE_UserSupervisor, + }; + + /** Page table operations specific to x86 ISA. + * Indended to be used as parameter of MultiLevelPageTable. + */ + class PageTableOps + { + public: + void setPTEFields(PageTableEntry& PTE, + uint64_t present = PTE_Present, + uint64_t read_write = PTE_ReadWrite, + uint64_t user_supervisor = PTE_UserSupervisor) + { + PTE.p = present; + PTE.w = read_write; + PTE.u = user_supervisor;// both user and supervisor access allowed + } + + /** returns the physical memory address of the page table */ + Addr getBasePtr(ThreadContext* tc) + { + CR3 cr3 = pageTablePhysAddr; + DPRINTF(MMU, "CR3: %d\n", cr3); + return cr3.longPdtb; + } + + /** returns the page number out of a page table entry */ + Addr getPnum(PageTableEntry PTE) + { + return PTE.base; + } + + /** sets the page number in a page table entry */ + void setPnum(PageTableEntry& PTE, Addr paddr) + { + PTE.base = paddr; + } + + /** returns the offsets to index in every level of a page + * table, contained in a virtual address + */ + std::vector<uint64_t> getOffsets(Addr vaddr) + { + X86ISA::VAddr addr(vaddr); + return {addr.longl1, addr.longl2, addr.longl3, addr.longl4}; + } + }; + } #endif diff --git a/src/arch/x86/pagetable_walker.cc b/src/arch/x86/pagetable_walker.cc index e75f2edc4..3d8cc9292 100644 --- a/src/arch/x86/pagetable_walker.cc +++ b/src/arch/x86/pagetable_walker.cc @@ -63,23 +63,6 @@ namespace X86ISA { -// Unfortunately, the placement of the base field in a page table entry is -// very erratic and would make a mess here. It might be moved here at some -// point in the future. -BitUnion64(PageTableEntry) - Bitfield<63> nx; - Bitfield<11, 9> avl; - Bitfield<8> g; - Bitfield<7> ps; - Bitfield<6> d; - Bitfield<5> a; - Bitfield<4> pcd; - Bitfield<3> pwt; - Bitfield<2> u; - Bitfield<1> w; - Bitfield<0> p; -EndBitUnion(PageTableEntry) - Fault Walker::start(ThreadContext * _tc, BaseTLB::Translation *_translation, RequestPtr _req, BaseTLB::Mode _mode) diff --git a/src/arch/x86/process.hh b/src/arch/x86/process.hh index 6a221e792..2fb051953 100644 --- a/src/arch/x86/process.hh +++ b/src/arch/x86/process.hh @@ -44,6 +44,7 @@ #include <vector> #include "sim/process.hh" +#include "mem/multi_level_page_table.hh" class SyscallDesc; @@ -133,6 +134,14 @@ namespace X86ISA X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val); }; + + /** + * Declaration of architectural page table for x86. + * + * These page tables are stored in system memory and respect x86 specification. + */ + typedef MultiLevelPageTable<PageTableOps> ArchPageTable; + } #endif // __ARCH_X86_PROCESS_HH__ diff --git a/src/arch/x86/system.hh b/src/arch/x86/system.hh index 998a69cd7..e8dd2f8b3 100644 --- a/src/arch/x86/system.hh +++ b/src/arch/x86/system.hh @@ -61,6 +61,20 @@ namespace X86ISA class FloatingPointer; class ConfigTable; } + + /* memory mappings for KVMCpu in SE mode */ + const uint64_t syscallCodeVirtAddr = 0xffff800000000000; + const uint64_t syscallCodePhysAddr = 0x60000; + const uint64_t GDTVirtAddr = 0xffff800000001000; + const uint64_t GDTPhysAddr = 0x61000; + const uint64_t IDTVirtAddr = 0xffff800000002000; + const uint64_t IDTPhysAddr = 0x62000; + const uint64_t TSSVirtAddr = 0xffff800000003000; + const uint64_t TSSPhysAddr = 0x63000; + const uint64_t ISTVirtAddr = 0xffff800000004000; + const uint64_t ISTPhysAddr = 0x64000; + + const uint64_t pageTablePhysAddr = 0x70000; } class X86System : public System |