feat(modules): now it loads segments with correct rights, not RWX everywhere
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
void ModuleLoad(BootModule* module) {
|
||||
OSProcess* userProc = HeapAllocate(sizeof(OSProcess));
|
||||
MemorySet(userProc, 0, sizeof(OSProcess));
|
||||
userProc->id = 1; // TODO: id gen
|
||||
userProc->id = SchedulerGetNextProcessID();
|
||||
userProc->state = OSTaskStateRunning;
|
||||
StringCopy(userProc->name, module->name);
|
||||
|
||||
@@ -19,18 +19,33 @@ void ModuleLoad(BootModule* module) {
|
||||
MemorySet(userL0Virt, 0, kVMPageSize);
|
||||
userProc->l0Table = userL0Virt;
|
||||
|
||||
Address physBase = module->physicalBase;
|
||||
Address virtBase = module->virtualBase;
|
||||
Size modSize = module->size;
|
||||
for (BIUInt32 s = 0; s < module->segmentCount; s++) {
|
||||
BootModuleSegment* seg = &module->segments[s];
|
||||
|
||||
UInt64 codeFlags = kPTENormalMem | kPTEUser | kPTEAccessRW | kPTEPrivNX; // TODO: kill RWX
|
||||
UInt64 segFlags = kPTENormalMem | kPTEUser;
|
||||
|
||||
for (Size i = 0; i < modSize; i += kVMPageSize) {
|
||||
VMMMapPage((Address*)userL0Phys, physBase + i, virtBase + i, codeFlags);
|
||||
if (seg->flags & PF_W) {
|
||||
// writable: AP[2]=0 (RW), which is the default
|
||||
} else {
|
||||
segFlags |= kPTEAccessRO;
|
||||
}
|
||||
|
||||
if (seg->flags & PF_X) {
|
||||
// executable: default is already executable
|
||||
} else {
|
||||
segFlags |= kPTEPrivNX | kPTEUserNX;
|
||||
}
|
||||
|
||||
for (Size i = 0; i < seg->size; i += kVMPageSize) {
|
||||
VMMMapPage((Address*)userL0Phys,
|
||||
seg->physicalBase + i,
|
||||
seg->virtualBase + i,
|
||||
segFlags);
|
||||
}
|
||||
|
||||
CPUCleanAndInvalidateCode((void*)VMPhysToHHDM(seg->physicalBase), seg->size);
|
||||
}
|
||||
|
||||
CPUCleanAndInvalidateCode((void*)VMPhysToHHDM(physBase), modSize);
|
||||
|
||||
Address stackPhys = (Address)PMMAllocatePage();
|
||||
Address userStackVirt = 0x80000000;
|
||||
UInt64 stackFlags = kPTENormalMem | kPTEUser | kPTEAccessRW | kPTEPrivNX | kPTEUserNX;
|
||||
|
||||
@@ -122,3 +122,7 @@ void SchedulerYield(UInt64 ticks) {
|
||||
gOSSchedulerCurrentTask->state = OSTaskStateSleeping;
|
||||
CPUException(kOSSchedulerExceptionNumber);
|
||||
}
|
||||
|
||||
UInt64 SchedulerGetNextProcessID() {
|
||||
return gOSSchedulerNextProcessID++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user