summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libddekit/pgtab-old.c219
1 files changed, 0 insertions, 219 deletions
diff --git a/libddekit/pgtab-old.c b/libddekit/pgtab-old.c
deleted file mode 100644
index 2b13698a..00000000
--- a/libddekit/pgtab-old.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * \brief Virtual page-table facility
- * \author Thomas Friebel <tf13@os.inf.tu-dresden.de>
- * \author Christian Helmuth <ch12@os.inf.tu-dresden.de>
- * \date 2006-11-01
- *
- * Implementation of page tables for saving virt->phys assignments.
- *
- * FIXME: This works for 32-bit architectures only! (Mostly because of pgtab.h.)
- */
-
-#include <l4/dde/ddekit/pgtab.h>
-
-#include <l4/sys/l4int.h>
-#include <l4/sys/consts.h>
-#include <l4/util/macros.h>
-#include <l4/dm_mem/dm_mem.h>
-#include <l4/log/l4log.h>
-
-
-/**********************************
- ** Page-table utility functions **
- **********************************/
-
-/* some useful consts */
-enum
-{
- PDIR_SHIFT = L4_SUPERPAGESHIFT, /* readable alias */
- PDIR_MASK = L4_SUPERPAGEMASK, /* readable alias */
- PDIR_ENTRIES = (1 << (L4_MWORD_BITS - PDIR_SHIFT)),
- PTAB_ENTRIES = (1 << (PDIR_SHIFT - L4_PAGESHIFT)),
- PTAB_SIZE = (sizeof(void*) * PTAB_ENTRIES)
-};
-
-/**
- * Page table entry.
- * bit 00-01: type, 0->largemalloc 1->slab page 2->contigmalloc (PTE_TYPE_*)
- * bit 02-11: size in number of pages
- * bit 12-31: physical page address
- */
-typedef union
-{
- unsigned compact;
- struct
- {
- unsigned type : 2;
- unsigned pages : 10;
- unsigned phys : 20;
- } components;
-} ddekit_pte;
-
-/**
- * Calculate offset of address in page directory - page-table number
- */
-static inline unsigned pt_num(l4_addr_t addr) {
- return addr >> PDIR_SHIFT; }
-
-
-/**
- * Calculate offset of address in page table - page number
- */
-static inline unsigned pg_num(l4_addr_t addr) {
- return (addr & ~PDIR_MASK) >> L4_PAGESHIFT; }
-
-
-/* page directory */
-static ddekit_pte *page_dir[PDIR_ENTRIES];
-
-
-/**
- * Get page-table entry
- */
-static inline ddekit_pte ddekit_get_pte(void *p)
-{
- l4_addr_t addr = (l4_mword_t)p;
- ddekit_pte *tab;
-
- tab = page_dir[pt_num(addr)];
- if (!tab) return (ddekit_pte) 0U;
-
- return tab[pg_num(addr)];
-}
-
-
-/**
- * Set page-table entry
- */
-static inline void ddekit_set_pte(void *p, ddekit_pte pte)
-{
- l4_addr_t addr = (l4_addr_t) p;
- ddekit_pte *tab;
-
- tab = page_dir[pt_num(addr)];
- if (!tab) {
- /* create new page table */
- tab = (ddekit_pte *)
- l4dm_mem_allocate_named(PTAB_SIZE, L4DM_CONTIGUOUS|L4DM_PINNED|L4RM_MAP,
- "ddekit ptab");
- Assert(tab);
-
- memset(tab, 0, PTAB_SIZE);
- page_dir[pt_num(addr)] = tab;
-
- if (1) {
- l4_addr_t a = l4_trunc_superpage(addr);
- LOG("created page table for range [0x%08lx,0x%08lx) @ %p\n",
- a, a + L4_SUPERPAGESIZE, tab);
- }
-
- }
-
- tab[pg_num(addr)] = pte;
-}
-
-
-/*****************************
- ** Page-table facility API **
- *****************************/
-
-/**
- * Set virtual->physical mapping for VM region
- *
- * \param virtual virtual start address for region
- * \param physical physical start address for region
- * \param pages number of pages in region
- * \param type pte type for region
- */
-void ddekit_pte_set_region(void *virtual, ddekit_addr_t physical, int pages, int type)
-{
- ddekit_pte new;
-
-#ifdef INVARIANTS
- ddekit_pte pte;
- /* assert pte not set yet */
- pte = ddekit_get_pte(virtual);
- LOGd(pte.compact, "first pte already set! pte=0x%04x", pte.compact);
-#endif
-
- /* build pte */
- new.components.type = type;
- new.components.pages = pages;
- new.components.phys = physical >> L4_PAGESHIFT;
-
- /* set first pte */
- ddekit_set_pte(virtual, new);
-
- /* continuation pte-s don't have pages set */
- new.components.pages = 0;
-
- /* set continuation pte-s */
- for (pages--; pages; pages--) {
- /* prepare continuation pte */
- virtual += L4_PAGESIZE;
- new.components.phys++;
-
-#ifdef INVARIANTS
- /* assert pte not set yet */
- pte = ddekit_get_pte(virtual);
- LOGd(pte.compact, "continuation pte already set! pte=0x%04x", pte.compact);
-#endif
-
- /* set continuation pte */
- ddekit_set_pte(virtual, new);
- }
-}
-
-
-/**
- * Clear virtual->physical mapping for VM region
- *
- * \param virtual virtual start address for region
- * \param type pte type for region
- *
- * XXX unused page-tables not free'd
- */
-void ddekit_pte_clear_region(void *virtual, int type)
-{
- ddekit_pte pte;
- int pages = 0;
- pte = ddekit_get_pte(virtual);
- /* get number of pages from pte */
- pages = pte.components.pages;
- /* assert pages != 0 */
- if (pages==0) {
- LOG("continuation pte found at base");
- return;
- }
- /* assert pte set and of correct type */
-#ifdef INVARIANTS
- LOGd(! pte.compact, "pte is already clear");
- LOGd(pte.components.type!=type, "pte of wrong type");
-#endif
- /* clear first pte */
- ddekit_set_pte(virtual, (ddekit_pte) 0U);
- /* clear continuation pte-s */
- for (pages--; pages; pages--) {
- virtual += L4_PAGESIZE;
-
-#ifdef INVARIANTS
- /* assert pte set and of correct type */
- pte = ddekit_get_pte(virtual);
- if (! pte.compact) {
- LOG("pte is already clear");
- break;
- }
- if (pte.components.type!=type) {
- LOG("pte of wrong type");
- break;
- }
- if (pte.components.pages) {
- LOG("unexpected non-continuation pte found");
- break;
- }
-#endif
-
- ddekit_set_pte(virtual, (ddekit_pte) 0U);
- }
-}
-