Skip to content

Commit

Permalink
kernel: paging: pass kernel_directory by argument
Browse files Browse the repository at this point in the history
  • Loading branch information
rouseabout committed Jan 10, 2025
1 parent a604f75 commit 777afae
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 66 deletions.
36 changes: 18 additions & 18 deletions kernel/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ static const char * get_cmdline_token(const char * token, const char * def, char
return out;
}

page_directory *kernel_directory;
static page_directory *kernel_directory;

static void pmm_init(uintptr_t low_size, uintptr_t up_size, uintptr_t extra);
static void init_paging(uintptr_t low_size);
Expand Down Expand Up @@ -884,7 +884,7 @@ void interrupt_handler(registers * regs);
void interrupt_handler(registers * regs)
{
switch_page_directory(kernel_directory);
load_user_pages(current_task->proc->page_directory);
load_user_pages(kernel_directory, current_task->proc->page_directory);
if (regs->number < 32) { /* exceptions */

if (regs->number == 13) {
Expand Down Expand Up @@ -1089,7 +1089,7 @@ void interrupt_handler(registers * regs)
switch_task(regs);
else {
switch_page_directory(current_task->proc->page_directory);
clear_user_pages();
clear_user_pages(kernel_directory);
}

} else {
Expand Down Expand Up @@ -1322,7 +1322,7 @@ static void shrink_cb(Halloc * cntx, uintptr_t boundary_addr)

static void dump_cb(Halloc * cntx)
{
dump_directory(kernel_directory, "directory", 0);
dump_directory(kernel_directory, kernel_directory, "directory", 0);
}

static void kheap_panic()
Expand Down Expand Up @@ -1442,7 +1442,7 @@ Task * idle_task;

static void init_tasking(const char * console_dev)
{
page_directory * directory = clone_directory(kernel_directory);
page_directory * directory = clone_directory(kernel_directory, kernel_directory);

current_task = ready_queue = kmalloc(sizeof(Task) + sizeof(Process), "task-init");
strlcpy(current_task->name, "init task", sizeof(current_task->name));
Expand Down Expand Up @@ -1557,7 +1557,7 @@ static int task_ready(Task * t)
Task * stopped = find_stopped(t->id);
if (stopped) {
if (t->u.waitpid.status) {
load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
*t->u.waitpid.status = MK_WAITPID_STATUS(0, 1);
}
stopped->u.stopped.parent_notified = 1;
Expand All @@ -1568,7 +1568,7 @@ static int task_ready(Task * t)
if (pp) {
Task * zombie = *pp;
if (t->u.waitpid.status) {
load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
*t->u.waitpid.status = MK_WAITPID_STATUS(zombie->proc->errorlevel, 0);
}
t->reg.eax = zombie->id;
Expand All @@ -1586,7 +1586,7 @@ static int task_ready(Task * t)

int sz = t->u.read.size - t->u.read.pos;

load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
int ret = vfs_read(t->u.read.fd, t->u.read.buf + t->u.read.pos, sz);
if (ret > 0)
t->u.read.pos += ret;
Expand All @@ -1606,7 +1606,7 @@ static int task_ready(Task * t)

int sz = t->u.write.size - t->u.write.pos;

load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
int ret = vfs_write(t->u.write.fd, t->u.write.buf + t->u.write.pos, sz);
if (ret > 0)
t->u.write.pos += ret;
Expand All @@ -1626,7 +1626,7 @@ static int task_ready(Task * t)
for (Join * j = t->proc->joins; j; j = j->next) {
if (j->thread == t->u.pthread_join.thread) {
if (t->u.pthread_join.value_ptr) {
load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
*t->u.pthread_join.value_ptr = j->value;
}
return 1;
Expand All @@ -1637,7 +1637,7 @@ static int task_ready(Task * t)
if (t->state == STATE_SELECT) {
fd_set r_response, w_response;

load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);

int count = process_fd_sets(t, t->u.select.nfds, t->u.select.readfds, t->u.select.writefds, &r_response, &w_response);

Expand Down Expand Up @@ -1719,7 +1719,7 @@ static int do_signal_action(int i)
static int process_signal(Task * t)
{
current_task = t;
load_user_pages(t->proc->page_directory);
load_user_pages(kernel_directory, t->proc->page_directory);
int i;
for (i = 0; i < 64 && !sigismember(&current_task->proc->signal, i); i++) ;
if (i == 64)
Expand Down Expand Up @@ -1789,7 +1789,7 @@ static void switch_task(registers * reg)

if (current_task == task0) {
switch_page_directory(current_task->proc->page_directory);
clear_user_pages();
clear_user_pages(kernel_directory);
return;
}

Expand All @@ -1800,7 +1800,7 @@ static void switch_task(registers * reg)
halloc_integrity_check(&kheap);
*reg = current_task->reg;
switch_page_directory(current_task->proc->page_directory);
clear_user_pages();
clear_user_pages(kernel_directory);
}

static void deliver_signal_pid(int pid, int signal)
Expand Down Expand Up @@ -1830,7 +1830,7 @@ static int sys_fork(const registers * reg)
{
kprintf("sys_fork %p pid=%d\n", current_task, current_task ? current_task->id : - 1);

page_directory * directory = clone_directory(current_task->proc->page_directory);
page_directory * directory = clone_directory(current_task->proc->page_directory, kernel_directory);
if (!directory)
return -ENOMEM;

Expand Down Expand Up @@ -1957,7 +1957,7 @@ static int exit2(int status, int thread_termination)
vfs_close(ct->proc->fd[i]);

/* free page directory and process frames */
clean_directory(ct->proc->page_directory, 1);
clean_directory(ct->proc->page_directory, 1, kernel_directory);

/* kill any threads belonging to this process */
kill_threads(current_task);
Expand Down Expand Up @@ -2259,7 +2259,7 @@ static uintptr_t create_task_elf_fd(page_directory * dir, FileDescriptor * fd)
continue;

create_vm_block(dir, p.p_vaddr, p.p_memsz);
load_user_pages(dir);
load_user_pages(kernel_directory, dir);

vfs_lseek(fd, p.p_offset, SEEK_SET);

Expand Down Expand Up @@ -2360,7 +2360,7 @@ static int sys_execve(registers * regs, const char * pathname, char * const argv

kill_threads(current_task);

clean_directory(current_task->proc->page_directory, 0);
clean_directory(current_task->proc->page_directory, 0, kernel_directory);

current_task->stack_top = USER_STACK_TOP;
alloc_stack(current_task->proc->page_directory, (void*)USER_STACK_TOP, USER_STACK_SIZE, 0xf1);
Expand Down
36 changes: 18 additions & 18 deletions kernel/paging.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,62 +80,62 @@ page_directory * alloc_new_page_directory(int use_reserve)
return (page_directory *)std_alloc_new_page_directory(use_reserve);
}

page_directory * clone_directory(const page_directory * src)
page_directory * clone_directory(const page_directory * src, const page_directory * kernel_directory)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
return (page_directory *)pae_clone_directory((pae_page_directory *)src);
return (page_directory *)pae_clone_directory((const pae_page_directory *)src, (const pae_page_directory *)kernel_directory);
else
#endif
return (page_directory *)std_clone_directory((std_page_directory *)src);
return (page_directory *)std_clone_directory((const std_page_directory *)src, (const std_page_directory *)kernel_directory);
}

void clean_directory(page_directory * dir, int free_all)
void clean_directory(page_directory * dir, int free_all, const page_directory * kernel_directory)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
pae_clean_directory((pae_page_directory *)dir, free_all);
pae_clean_directory((pae_page_directory *)dir, free_all, (const pae_page_directory *)kernel_directory);
else
#endif
std_clean_directory((std_page_directory *)dir, free_all);
std_clean_directory((std_page_directory *)dir, free_all, (const std_page_directory *)kernel_directory);
}

void dump_directory(const page_directory * dir, const char * name, int hexdump)
void dump_directory(const page_directory * dir, const page_directory * kernel_directory, const char * name, int hexdump)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
pae_dump_directory((pae_page_directory *)dir, name, hexdump);
pae_dump_directory((const pae_page_directory *)dir, (const pae_page_directory *)kernel_directory, name, hexdump);
else
#endif
std_dump_directory((std_page_directory *)dir, name, hexdump);
std_dump_directory((const std_page_directory *)dir, (const std_page_directory *)kernel_directory, name, hexdump);
}

void switch_page_directory(page_directory * dir)
void switch_page_directory(const page_directory * dir)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
pae_switch_page_directory((pae_page_directory *)dir);
pae_switch_page_directory((const pae_page_directory *)dir);
else
#endif
std_switch_page_directory((std_page_directory *)dir);
std_switch_page_directory((const std_page_directory *)dir);
}

void load_user_pages(const page_directory * src)
void load_user_pages(page_directory * kernel_directory, const page_directory * src)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
pae_load_user_pages((pae_page_directory *)src);
pae_load_user_pages((pae_page_directory *)kernel_directory, (const pae_page_directory *)src);
else
#endif
std_load_user_pages((std_page_directory *)src);
std_load_user_pages((std_page_directory *)kernel_directory, (const std_page_directory *)src);
}

void clear_user_pages(void)
void clear_user_pages(page_directory * kernel_directory)
{
#if defined(ARCH_i686)
if (cpu_has_pae)
pae_clear_user_pages();
pae_clear_user_pages((pae_page_directory *)kernel_directory);
else
#endif
std_clear_user_pages();
std_clear_user_pages((std_page_directory *)kernel_directory);
}
12 changes: 6 additions & 6 deletions kernel/paging.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ uint64_t page_get_phy_address(const page_entry *page);
void set_frame_identity(page_entry * page, uint64_t addr, int flags);

page_directory * alloc_new_page_directory(int use_reserve);
page_directory * clone_directory(const page_directory * src);
void clean_directory(page_directory * dir, int free_all);
void dump_directory(const page_directory * dir, const char * name, int hexdump);
page_directory * clone_directory(const page_directory * src, const page_directory * kernel_directory);
void clean_directory(page_directory * dir, int free_all, const page_directory * kernel_directory);
void dump_directory(const page_directory * dir, const page_directory * kernel_directory, const char * name, int hexdump);

void switch_page_directory(page_directory * dir);
void load_user_pages(const page_directory * src);
void clear_user_pages(void);
void switch_page_directory(const page_directory * dir);
void load_user_pages(page_directory * kernel_directory, const page_directory * src);
void clear_user_pages(page_directory * kernel_directory);

extern uintptr_t clone_vaddr;
extern page_entry * clone_pe;
Expand Down
33 changes: 15 additions & 18 deletions kernel/paging_template.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@

extern page_directory *kernel_directory;
extern uintptr_t clone_vaddr;
extern page_entry * clone_pe;


#include "utils.h"
#include <string.h>
#include <stdlib.h>
Expand Down Expand Up @@ -77,13 +74,13 @@ static void dump_directory_r(const page_directory * dir, const page_directory *
}
}

void RENAME(dump_directory)(const page_directory * dir, const char * name, int hexdump)
void RENAME(dump_directory)(const page_directory * dir, const page_directory * kernel_directory, const char * name, int hexdump)
{
dump_directory_r(dir, kernel_directory, name, hexdump, PAGE_LEVELS, 0);
kprintf("\n");
}

void RENAME(load_user_pages)(const page_directory * src)
void RENAME(load_user_pages)(page_directory * kernel_directory, const page_directory * src)
{
for (unsigned int i = 0; i < ENTRIES_PER_TABLE; i++) {
uintptr_t base2 = (uintptr_t)i << (12 + (PAGE_LEVELS - 1)*BITS_PER_TABLE);
Expand All @@ -95,7 +92,7 @@ void RENAME(load_user_pages)(const page_directory * src)
RENAME(switch_page_directory)(kernel_directory);
}

void RENAME(clear_user_pages)()
void RENAME(clear_user_pages)(page_directory * kernel_directory)
{
for (unsigned int i = 0; i < ENTRIES_PER_TABLE; i++) {
uintptr_t base2 = (uintptr_t)i << (12 + (PAGE_LEVELS - 1)*BITS_PER_TABLE);
Expand Down Expand Up @@ -201,7 +198,7 @@ uint64_t RENAME(page_get_phy_address)(const page_entry *page)
}


static page_table * RENAME(clone_table)(const page_table * src, uintptr_t * physical_address, uintptr_t base)
static page_table * RENAME(clone_table)(const page_table * src, uintptr_t * physical_address, uintptr_t base, const page_directory * kernel_directory)
{
page_table * table = (page_table *)kmalloc_ap(sizeof(page_table), physical_address, "pg-table-clone");
//kprintf("page_table %p (%d bytes)\n", table, sizeof(page_table));
Expand Down Expand Up @@ -254,9 +251,9 @@ _(dirty)
return table;
}

static int clean_directory_r(page_directory * dir, const page_directory * kd, int level, uintptr_t base, int free_all);
static int clean_directory_r(page_directory * dir, const page_directory * kd, int level, uintptr_t base, int free_all, const page_directory * kernel_directory);

static page_directory * clone_directory_r(const page_directory * src, const page_directory * kd, uintptr_t * pphys, int level, uintptr_t base)
static page_directory * clone_directory_r(const page_directory * src, const page_directory * kd, uintptr_t * pphys, int level, uintptr_t base, const page_directory * kernel_directory)
{
page_directory * dir = (page_directory *)kmalloc_ap(sizeof(page_directory), pphys, "pg-dir-clone");
if (!dir)
Expand All @@ -275,9 +272,9 @@ static page_directory * clone_directory_r(const page_directory * src, const page
dir->tables_physical[i] = src->tables_physical[i];
} else {
uintptr_t phys;
dir->tables[i] = level > 2 ? clone_directory_r(src->tables[i], kd ? kd->tables[i] : NULL, &phys, level - 1, base2) : (page_directory *)RENAME(clone_table)((const page_table *)src->tables[i], &phys, base2) ;
dir->tables[i] = level > 2 ? clone_directory_r(src->tables[i], kd ? kd->tables[i] : NULL, &phys, level - 1, base2, kernel_directory) : (page_directory *)RENAME(clone_table)((const page_table *)src->tables[i], &phys, base2, kernel_directory) ;
if (!dir->tables[i]) {
clean_directory_r(dir, kd, level, base, 1);
clean_directory_r(dir, kd, level, base, 1, kernel_directory);
kfree(dir);
return NULL;
}
Expand All @@ -293,10 +290,10 @@ static page_directory * clone_directory_r(const page_directory * src, const page
return dir;
}

page_directory * RENAME(clone_directory)(const page_directory * src)
page_directory * RENAME(clone_directory)(const page_directory * src, const page_directory * kernel_directory)
{
uintptr_t phys;
return clone_directory_r(src, (page_directory *)kernel_directory, &phys, PAGE_LEVELS, 0);
return clone_directory_r(src, kernel_directory, &phys, PAGE_LEVELS, 0, kernel_directory);
}

/* remove all non-kernel pages from the directory */
Expand All @@ -309,7 +306,7 @@ static void RENAME(clean_table)(page_table * table)
}
}

static int clean_directory_r(page_directory * dir, const page_directory * kd, int level, uintptr_t base, int free_all)
static int clean_directory_r(page_directory * dir, const page_directory * kd, int level, uintptr_t base, int free_all, const page_directory * kernel_directory)
{
int empty = 1;
for (unsigned int i = 0; i < ENTRIES_PER_TABLE; i++) {
Expand All @@ -322,7 +319,7 @@ static int clean_directory_r(page_directory * dir, const page_directory * kd, in
}
int free_this;
if (level > 2) {
free_this = clean_directory_r(dir->tables[i], kd ? kd->tables[i] : NULL, level - 1, base2, free_all);
free_this = clean_directory_r(dir->tables[i], kd ? kd->tables[i] : NULL, level - 1, base2, free_all, kernel_directory);
} else {
RENAME(clean_table)((page_table *)dir->tables[i]);
free_this = 1;
Expand All @@ -338,14 +335,14 @@ static int clean_directory_r(page_directory * dir, const page_directory * kd, in
return empty;
}

void RENAME(clean_directory)(page_directory * dir, int free_all)
void RENAME(clean_directory)(page_directory * dir, int free_all, const page_directory * kernel_directory)
{
clean_directory_r(dir, kernel_directory, PAGE_LEVELS, 0, free_all);
clean_directory_r(dir, kernel_directory, PAGE_LEVELS, 0, free_all, kernel_directory);
if (free_all)
kfree(dir);
}

void RENAME(switch_page_directory)(page_directory * dir)
void RENAME(switch_page_directory)(const page_directory * dir)
{
asm volatile("mov %0, %%cr3" : : "r" (dir->physical_address));
}
12 changes: 6 additions & 6 deletions kernel/paging_template.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ uint64_t RENAME(page_get_phy_address)(const page_entry *page);
void RENAME(set_frame_identity)(page_entry * page, uint64_t addr, int flags);

page_directory * RENAME(alloc_new_page_directory)(int use_reserve);
page_directory * RENAME(clone_directory)(const page_directory * src);
void RENAME(clean_directory)(page_directory * dir, int free_all);
void RENAME(dump_directory)(const page_directory * dir, const char * name, int hexdump);
page_directory * RENAME(clone_directory)(const page_directory * src, const page_directory * kernel_directory);
void RENAME(clean_directory)(page_directory * dir, int free_all, const page_directory * kernel_directory);
void RENAME(dump_directory)(const page_directory * dir, const page_directory * kernel_directory, const char * name, int hexdump);

void RENAME(switch_page_directory)(page_directory * dir);
void RENAME(load_user_pages)(const page_directory * src);
void RENAME(clear_user_pages)(void);
void RENAME(switch_page_directory)(const page_directory * dir);
void RENAME(load_user_pages)(page_directory * kernel_directory, const page_directory * src);
void RENAME(clear_user_pages)(page_directory * kernel_directory);

0 comments on commit 777afae

Please sign in to comment.