init: use zero driver for stack alloc

This commit is contained in:
Mathieu Maret 2024-02-08 00:07:12 +01:00 committed by Mathieu Maret
parent 07a3a33719
commit b0ec767295
2 changed files with 20 additions and 21 deletions

View File

@ -13,13 +13,11 @@
* @return 0 when the program is not a valid ELF * @return 0 when the program is not a valid ELF
*/ */
uaddr_t loadElfProg(const char *prog, struct process * proc) uaddr_t loadElfProg(const char *prog, struct process *proc)
{ {
int i; int i;
uaddr_t lastUserAddr = 0; uaddr_t lastUserAddr = 0;
/* e_ident value */ /* e_ident value */
#define ELFMAG0 0x7f #define ELFMAG0 0x7f
#define ELFMAG1 'E' #define ELFMAG1 'E'

View File

@ -84,27 +84,28 @@ void loadUserSpace()
return; return;
} }
struct process *proc = processCreate("init"); {
struct process *proc = processCreate("init");
struct uAddrSpace *as = processGetAddrSpace(proc);
threadChangeCurrentContext(processGetMMUContext(proc)); threadChangeCurrentContext(processGetMMUContext(proc));
uaddr_t prog = loadElfProg(buf + FILE_HEADER_SIZE, proc); uaddr_t prog = loadElfProg(buf + FILE_HEADER_SIZE, proc);
if (prog == (uaddr_t)NULL) { if (prog == (uaddr_t)NULL) {
free(buf); free(buf);
return; return;
}
// Alloc user stack
size_t stackSize = PAGE_SIZE * 2;
uaddr_t stack = PAGING_TOP_USER_ADDRESS - stackSize + 1;
zeroMmap(as, &stack, stackSize, PAGING_MEM_USER | PAGING_MEM_WRITE | PAGING_MEM_READ,
0);
threadCreateUser("init", proc, prog, 0, 0, stack + stackSize - 4);
processUnref(proc);
threadChangeCurrentContext(NULL);
} }
// Alloc user stack
uaddr_t stackTop = 0xfffffffc;
uaddr_t stackBottom = ALIGN_DOWN(stackTop, PAGE_SIZE);
paddr_t stackPhy = allocPhyPage(1);
assert(pageMap(stackBottom, stackPhy,
PAGING_MEM_USER | PAGING_MEM_WRITE | PAGING_MEM_READ) == 0);
unrefPhyPage(stackPhy);
threadCreateUser("init", proc, prog, 0, 0, stackTop);
processUnref(proc);
threadChangeCurrentContext(NULL);
free(buf); free(buf);
} }