diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-07-08 17:42:40 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-07-08 17:42:40 -0500 |
commit | 204c3d248426c2ba0b332c05994d67a80f49f958 (patch) | |
tree | d0bbf0ca1b17349458cc938fd08846fa1c74e2ff /src/include | |
parent | 2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (diff) | |
download | talos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.tar.gz talos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.zip |
MMIO mapping support and syscalls.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/kernel/ppcarch.H | 18 | ||||
-rw-r--r-- | src/include/kernel/syscalls.H | 3 | ||||
-rw-r--r-- | src/include/kernel/vmmmgr.H | 40 | ||||
-rw-r--r-- | src/include/sys/mmio.h | 18 |
4 files changed, 69 insertions, 10 deletions
diff --git a/src/include/kernel/ppcarch.H b/src/include/kernel/ppcarch.H index 71d4516d4..91ee138a2 100644 --- a/src/include/kernel/ppcarch.H +++ b/src/include/kernel/ppcarch.H @@ -58,4 +58,22 @@ inline void ppc_setMSR(uint64_t _msr) asm volatile("mtmsr %0; isync" :: "r" (msr)); } +__attribute__((always_inline)) +inline uint64_t ppc_getDSISR() +{ + register uint64_t dsisr = 0; + asm volatile("mfspr %0, 18" : "=r" (dsisr)); + return dsisr; +} + +__attribute__((always_inline)) +inline uint64_t ppc_getDAR() +{ + register uint64_t dar = 0; + asm volatile("mfspr %0, 19" : "=r" (dar)); + return dar; +} + + + #endif diff --git a/src/include/kernel/syscalls.H b/src/include/kernel/syscalls.H index 9a0672d63..a33a0cef7 100644 --- a/src/include/kernel/syscalls.H +++ b/src/include/kernel/syscalls.H @@ -25,6 +25,9 @@ namespace Systemcalls MSG_RESPOND, MSG_WAIT, + MMIO_MAP, + MMIO_UNMAP, + SYSCALL_MAX }; }; diff --git a/src/include/kernel/vmmmgr.H b/src/include/kernel/vmmmgr.H index e55595ed5..a8bb5ae3f 100644 --- a/src/include/kernel/vmmmgr.H +++ b/src/include/kernel/vmmmgr.H @@ -2,6 +2,7 @@ #define __KERNEL_VMMMGR_H #include <kernel/types.h> +#include <kernel/spinlock.H> class VmmManager { @@ -26,6 +27,7 @@ class VmmManager enum ACCESS_TYPES { NO_USER_ACCESS, + READ_O_ACCESS, NORMAL_ACCESS, CI_ACCESS, }; @@ -37,32 +39,49 @@ class VmmManager FirstPid, }; + enum MMIO_SPACE_INFO + { + MMIO_T_ENTRIES = + FULL_MEM_SIZE * (MMIOSpace - LinearSpace) / PAGESIZE, + }; + static void init(); static void init_slb(); + static bool pteMiss(task_t*); + + static void* mmioMap(void*, size_t); + static int mmioUnmap(void*, size_t); protected: VmmManager(); ~VmmManager() {}; private: + Spinlock lock; + uint64_t mmioMapT[MMIO_T_ENTRIES]; + void initSLB(); void initPTEs(); void initSDR1(); + bool _pteMiss(task_t*); + void* _mmioMap(void*, size_t); + int _mmioUnmap(void*, size_t); + static pte_t* page_table; - inline pte_t& getPte(uint64_t pteg, uint64_t idx) + inline volatile pte_t& getPte(uint64_t pteg, uint64_t idx) { return page_table[pteg * PTEG_SIZE + idx]; } - inline void defaultPte(pte_t& pte) + inline void defaultPte(volatile pte_t& pte) { pte.a = 0x4000000000000000; // B = 01 (1TB). pte.b = 0x0; } - inline void setValid(bool valid, pte_t& pte) + inline void setValid(bool valid, volatile pte_t& pte) { // Adding a page requires EIEIO to ensure update of PTE prior // to making valid and PTESYNC afterwards. @@ -78,39 +97,40 @@ class VmmManager asm volatile("ptesync" ::: "memory"); } - inline bool isValid(pte_t& pte) + inline bool isValid(volatile pte_t& pte) { return ((pte.a & 0x01) == 0x01); } - inline void setTid(tid_t tid, pte_t& pte) + inline void setTid(tid_t tid, volatile pte_t& pte) { pte.a &= 0xC00000000000007F; pte.a |= ((uint64_t) tid) << 7; } - inline tid_t getTid(pte_t& pte) + inline tid_t getTid(volatile pte_t& pte) { return (tid_t) ((pte.a & 0xC00000000000007F) >> 7); } - inline void setAccess(ACCESS_TYPES t, pte_t& pte) + inline void setAccess(ACCESS_TYPES t, volatile pte_t& pte) { uint64_t pteMask = ~0x800000000000007B; pte.b &= pteMask; pte.b |= (NO_USER_ACCESS == t ? 0x0000000000000010 : + (READ_O_ACCESS == t ? 0x0000000000000011 : (NORMAL_ACCESS == t ? 0x0000000000000012 : (CI_ACCESS == t ? 0x000000000000002A : - 0x0))); + 0x0)))); } - inline void setPage(uint64_t page, pte_t& pte) + inline void setPage(uint64_t page, volatile pte_t& pte) { pte.b &= ~0x0FFFFFFFFFFFF000; pte.b |= page << 12; } - inline uint64_t getPage(pte_t& pte) + inline uint64_t getPage(volatile pte_t& pte) { return (pte.b & 0x0FFFFFFFFFFFF000) >> 12; } diff --git a/src/include/sys/mmio.h b/src/include/sys/mmio.h new file mode 100644 index 000000000..6a0e7a02b --- /dev/null +++ b/src/include/sys/mmio.h @@ -0,0 +1,18 @@ +#ifndef __SYS_MMIO_H +#define __SYS_MMIO_H + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +void* mmio_map(void* ra, size_t pages); +int mmio_unmap(void* ea, size_t pages); + +#ifdef __cplusplus +} +#endif + +#endif |