WIP
This commit is contained in:
@ -18,7 +18,7 @@ int32_t SYSCALL5(sys_mman_map, addr1, size1, prot1, flags1, out1) {
|
||||
uint64_t flags = flags1;
|
||||
uint8_t **out = (uint8_t **)out1;
|
||||
|
||||
if (size % HAL_PAGE_SIZE != 0) {
|
||||
if (size == 0 || (size % HAL_PAGE_SIZE != 0)) {
|
||||
if (out != NULL) {
|
||||
*out = NULL;
|
||||
}
|
||||
@ -37,11 +37,19 @@ int32_t SYSCALL5(sys_mman_map, addr1, size1, prot1, flags1, out1) {
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
uint8_t *virt = NULL;
|
||||
if (flags & MMAN_MAP_F_FIXED && addr != NULL) {
|
||||
if ((flags & MMAN_MAP_F_FIXED) && addr != NULL) {
|
||||
if ((uintptr_t)addr % HAL_PAGE_SIZE != 0) {
|
||||
if (out != NULL) {
|
||||
*out = NULL;
|
||||
}
|
||||
pmm_free((uintptr_t)phys, pages);
|
||||
return E_INVALIDARGUMENT;
|
||||
}
|
||||
|
||||
virt = addr;
|
||||
} else {
|
||||
virt = (uint8_t *)proc->mman_map_base;
|
||||
proc->mman_map_base += size;
|
||||
proc->mman_map_base += pages * HAL_PAGE_SIZE;
|
||||
}
|
||||
|
||||
uint64_t pflags = HAL_PG_USER | HAL_PG_PRESENT;
|
||||
@ -49,11 +57,11 @@ int32_t SYSCALL5(sys_mman_map, addr1, size1, prot1, flags1, out1) {
|
||||
pflags |= HAL_PG_RW;
|
||||
}
|
||||
|
||||
hal_vmm_map_range(VIRT(proc->platformdata.cr3), virt, phys, size, pflags);
|
||||
hal_vmm_map_range(proc->platformdata.cr3, virt, phys, pages * HAL_PAGE_SIZE, pflags);
|
||||
VasRange *range = dlmalloc(sizeof(*range));
|
||||
range->virtstart = virt;
|
||||
range->physstart = phys;
|
||||
range->size = size * HAL_PAGE_SIZE;
|
||||
range->size = pages * HAL_PAGE_SIZE;
|
||||
range->pgflags = pflags;
|
||||
LL_APPEND(proc->vas, range);
|
||||
|
||||
@ -91,7 +99,7 @@ int32_t SYSCALL1(sys_mman_unmap, addr1) {
|
||||
return E_INVALIDARGUMENT;
|
||||
}
|
||||
|
||||
hal_vmm_unmap_range(VIRT(proc->platformdata.cr3), tofree->virtstart, tofree->physstart, tofree->size);
|
||||
hal_vmm_unmap_range(proc->platformdata.cr3, tofree->virtstart, tofree->physstart, tofree->size);
|
||||
LL_REMOVE(proc->vas, tofree);
|
||||
pmm_free((uintptr_t)tofree->physstart, tofree->size / HAL_PAGE_SIZE);
|
||||
dlfree(tofree);
|
||||
|
@ -29,7 +29,7 @@ int32_t SYSCALL5(sys_processctl, pid1, cmd1, arg1, arg2, arg3) {
|
||||
|
||||
if (proc == NULL) {
|
||||
if (cmd == PCTL_POLLSTATE) {
|
||||
ret = 2;
|
||||
ret = PROC_DIED;
|
||||
goto done;
|
||||
}
|
||||
ret = E_INVALIDARGUMENT;
|
||||
@ -104,6 +104,44 @@ int32_t SYSCALL5(sys_processctl, pid1, cmd1, arg1, arg2, arg3) {
|
||||
}
|
||||
ret = E_OK;
|
||||
} break;
|
||||
case PCTL_PLS_SZ: {
|
||||
size_t i = 0;
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *p = PROCS.procs;
|
||||
while (p) {
|
||||
i++;
|
||||
p = p->next;
|
||||
}
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
ret = i;
|
||||
} break;
|
||||
case PCTL_PLS_STAT: {
|
||||
uint64_t pidx = arg1;
|
||||
ProcStat *stat = (ProcStat *)arg2;
|
||||
|
||||
if (stat == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *p = PROCS.procs;
|
||||
while (p) {
|
||||
if (i == pidx) {
|
||||
stat->pid = p->pid;
|
||||
hal_strcpy(stat->name, p->name);
|
||||
stat->state = p->state;
|
||||
stat->kern = p->kern;
|
||||
break;
|
||||
}
|
||||
|
||||
i++;
|
||||
p = p->next;
|
||||
}
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
ret = E_OK;
|
||||
} break;
|
||||
default: {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
} break;
|
||||
|
Reference in New Issue
Block a user