summaryrefslogtreecommitdiff
path: root/libddekit/pgtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'libddekit/pgtab.c')
-rw-r--r--libddekit/pgtab.c138
1 files changed, 14 insertions, 124 deletions
diff --git a/libddekit/pgtab.c b/libddekit/pgtab.c
index 3c39f54f..88273b7c 100644
--- a/libddekit/pgtab.c
+++ b/libddekit/pgtab.c
@@ -11,47 +11,12 @@
* For this to work, dataspaces must be attached to l4rm regions!
*/
-#include <l4/dde/ddekit/pgtab.h>
-#include <l4/dde/ddekit/memory.h>
-#include <l4/dde/ddekit/panic.h>
+#include <mach.h>
-#include <l4/l4rm/l4rm.h>
-#include <l4/lock/lock.h>
-#include <l4/util/macros.h>
+#include "ddekit/pgtab.h"
#include "config.h"
-
-/**
- * "Page-table" object
- */
-struct pgtab_object
-{
- l4_addr_t va; /* virtual start address */
- l4_addr_t pa; /* physical start address */
-
- /* FIXME reconsider the following members */
- l4_size_t size;
- unsigned type; /* pgtab region type */
-
- struct pgtab_object * next;
- struct pgtab_object * prev;
-};
-
-/**
- * pa_list_head of page-table object list (for get_virtaddr())
- */
-static struct pgtab_object pa_list_head =
- {
- .va = 0,
- .pa = 0,
- .size = 0,
- .next = &pa_list_head,
- .prev = &pa_list_head
- };
-
-static l4lock_t pa_list_lock = L4LOCK_UNLOCKED;
-
/*****************************
** Page-table facility API **
*****************************/
@@ -64,18 +29,8 @@ static l4lock_t pa_list_lock = L4LOCK_UNLOCKED;
*/
ddekit_addr_t ddekit_pgtab_get_physaddr(const void *virtual)
{
- /* find pgtab object */
- struct pgtab_object *p = l4rm_get_userptr(virtual);
- if (!p) {
- /* XXX this is verbose */
- LOG_Error("no virt->phys mapping for virtual address %p", virtual);
- return 0;
- }
-
- /* return virt->phys mapping */
- l4_size_t offset = (l4_addr_t) virtual - p->va;
-
- return p->pa + offset;
+ extern int virt_to_phys (vm_address_t addr);
+ return virt_to_phys ((vm_address_t) virtual);
}
/**
@@ -86,32 +41,14 @@ ddekit_addr_t ddekit_pgtab_get_physaddr(const void *virtual)
*/
ddekit_addr_t ddekit_pgtab_get_virtaddr(const ddekit_addr_t physical)
{
- /* find pgtab object */
- struct pgtab_object *p;
- ddekit_addr_t retval = 0;
-
- /* find phys->virt mapping */
- l4lock_lock(&pa_list_lock);
- for (p = pa_list_head.next ; p != &pa_list_head ; p = p->next) {
- if (p->pa <= (l4_addr_t)physical &&
- (l4_addr_t)physical < p->pa + p->size) {
- l4_size_t offset = (l4_addr_t) physical - p->pa;
- retval = p->va + offset;
- break;
- }
- }
- l4lock_unlock(&pa_list_lock);
-
- if (!retval)
- LOG_Error("no phys->virt mapping for physical address %p", (void*)physical);
-
- return retval;
+ extern int phys_to_virt (vm_address_t addr);
+ return phys_to_virt (physical);
}
-
-
+// TODO
int ddekit_pgtab_get_type(const void *virtual)
{
+#if 0
/* find pgtab object */
struct pgtab_object *p = l4rm_get_userptr(virtual);
if (!p) {
@@ -121,11 +58,14 @@ int ddekit_pgtab_get_type(const void *virtual)
}
return p->type;
+#endif
+ return 0;
}
-
+//TODO
int ddekit_pgtab_get_size(const void *virtual)
{
+#if 0
/* find pgtab object */
struct pgtab_object *p = l4rm_get_userptr(virtual);
if (!p) {
@@ -135,6 +75,8 @@ int ddekit_pgtab_get_size(const void *virtual)
}
return p->size;
+#endif
+ return 0;
}
@@ -146,28 +88,6 @@ int ddekit_pgtab_get_size(const void *virtual)
*/
void ddekit_pgtab_clear_region(void *virtual, int type)
{
- struct pgtab_object *p;
-
- /* find pgtab object */
- p = (struct pgtab_object *)l4rm_get_userptr(virtual);
- if (!p) {
- /* XXX this is verbose */
- LOG_Error("no virt->phys mapping for %p", virtual);
- return;
- }
-
- /* reset userptr in region map */
- /* XXX no error handling here */
- l4rm_set_userptr(virtual, 0);
-
- /* remove pgtab object from list */
- l4lock_lock(&pa_list_lock);
- p->next->prev= p->prev;
- p->prev->next= p->next;
- l4lock_unlock(&pa_list_lock);
-
- /* free pgtab object */
- ddekit_simple_free(p);
}
@@ -181,39 +101,9 @@ void ddekit_pgtab_clear_region(void *virtual, int type)
*/
void ddekit_pgtab_set_region(void *virtual, ddekit_addr_t physical, int pages, int type)
{
- /* allocate pgtab object */
- struct pgtab_object *p = ddekit_simple_malloc(sizeof(*p));
- if (!p) {
- LOG_Error("ddekit heap exhausted");
- return;
- }
-
- /* initialize pgtab object */
- p->va = l4_trunc_page(virtual);
- p->pa = l4_trunc_page(physical);
- p->size = pages * L4_PAGESIZE;
- p->type = type;
-
- l4lock_lock(&pa_list_lock);
- p->next=pa_list_head.next;
- p->prev=&pa_list_head;
- pa_list_head.next->prev=p;
- pa_list_head.next=p;
- l4lock_unlock(&pa_list_lock);
-
- /* set userptr in region map to pgtab object */
- int err = l4rm_set_userptr((void *)p->va, p);
- if (err) {
- LOG_Error("l4rm_set_userptr returned %d", err);
- ddekit_panic("l4rm_set_userptr");
- ddekit_simple_free(p);
- }
}
void ddekit_pgtab_set_region_with_size(void *virt, ddekit_addr_t phys, int size, int type)
{
- int p = l4_round_page(size);
- p >>= L4_PAGESHIFT;
- ddekit_pgtab_set_region(virt, phys, p, type);
}