mirror of
https://github.com/drasko/codezero.git
synced 2026-04-17 17:29:04 +02:00
Adding support for refcounted page tables. Fixed freeing of kernel pmds on copy_page_tables
This commit is contained in:
@@ -39,6 +39,12 @@ struct task_ids {
|
|||||||
l4id_t tgid;
|
l4id_t tgid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A simple page table with a reference count */
|
||||||
|
struct address_space {
|
||||||
|
struct pgd_table_t *pgd;
|
||||||
|
int ktcb_refs;
|
||||||
|
};
|
||||||
|
|
||||||
struct ktcb {
|
struct ktcb {
|
||||||
/* User context */
|
/* User context */
|
||||||
task_context_t context;
|
task_context_t context;
|
||||||
@@ -86,7 +92,7 @@ struct ktcb {
|
|||||||
int nlocks;
|
int nlocks;
|
||||||
|
|
||||||
/* Page table information */
|
/* Page table information */
|
||||||
pgd_table_t *pgd;
|
struct address_space *space;
|
||||||
|
|
||||||
/* Fields for ipc rendezvous */
|
/* Fields for ipc rendezvous */
|
||||||
struct waitqueue_head wqh_recv;
|
struct waitqueue_head wqh_recv;
|
||||||
|
|||||||
@@ -256,6 +256,12 @@ int thread_setup_new_ids(struct task_ids *ids, unsigned int flags,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define KTCB_CREATE_PAGE_TABLES (1 << 0)
|
||||||
|
/* Allocates a ktcb and page tables depending on flags */
|
||||||
|
struct ktcb *ktcb_create(unsigned int flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Creates a thread, with a new thread id, and depending on the flags,
|
* Creates a thread, with a new thread id, and depending on the flags,
|
||||||
* either creates a new space, uses the same space as another thread,
|
* either creates a new space, uses the same space as another thread,
|
||||||
|
|||||||
@@ -460,9 +460,11 @@ pgd_table_t *copy_page_tables(pgd_table_t *from)
|
|||||||
return pgd;
|
return pgd;
|
||||||
|
|
||||||
out_error:
|
out_error:
|
||||||
/* Find all allocated pmds and free them */
|
/* Find all allocated non-kernel pmds and free them */
|
||||||
for (int i = 0; i < PGD_ENTRY_TOTAL; i++) {
|
for (int i = 0; i < PGD_ENTRY_TOTAL; i++) {
|
||||||
if ((pgd->entry[i] & PGD_TYPE_MASK) == PGD_TYPE_COARSE) {
|
/* Non-kernel pmd that has just been allocated. */
|
||||||
|
if (!is_kern_pgdi(i) &&
|
||||||
|
(pgd->entry[i] & PGD_TYPE_MASK) == PGD_TYPE_COARSE) {
|
||||||
/* Obtain the pmd handle */
|
/* Obtain the pmd handle */
|
||||||
pmd = (pmd_table_t *)
|
pmd = (pmd_table_t *)
|
||||||
phys_to_virt((pgd->entry[i] &
|
phys_to_virt((pgd->entry[i] &
|
||||||
|
|||||||
Reference in New Issue
Block a user