Merge remote-tracking branch 'refs/remotes/origin/master'
This commit is contained in:
@@ -26,7 +26,7 @@ void switchToUsermode(void *stackpointer, void *kickoff,
|
|||||||
"pushq %[user_eflags] \n" \
|
"pushq %[user_eflags] \n" \
|
||||||
"pushq %[user_code] \n" \
|
"pushq %[user_code] \n" \
|
||||||
"pushq %[user_function] \n" \
|
"pushq %[user_function] \n" \
|
||||||
"mov %[user_parameter], %%rdi\n" \
|
"mov %[user_parameter], %%rax\n" \
|
||||||
"iretq \n" \
|
"iretq \n" \
|
||||||
: \
|
: \
|
||||||
: [user_data] "r"((uint64_t)user_ds),
|
: [user_data] "r"((uint64_t)user_ds),
|
||||||
|
|||||||
@@ -65,13 +65,13 @@ static void printContext(const InterruptContext *context) {
|
|||||||
uint64_t pf_number = uint64_t (pf >> 12 );
|
uint64_t pf_number = uint64_t (pf >> 12 );
|
||||||
|
|
||||||
if(PageFrameAllocator::PageFrames[pf_number].ref_count==1){
|
if(PageFrameAllocator::PageFrames[pf_number].ref_count==1){
|
||||||
setMapping(virt, (void*) pf , paging_tree, 1);
|
setMapping(virt, (void*) pf , paging_tree, true);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false);
|
uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false);
|
||||||
//Syscall::Skeleton::map(page, 4096);
|
//Syscall::Skeleton::map(page, 4096);
|
||||||
setMapping(virt, (void*) page , paging_tree, 1);
|
setMapping(virt, (void*) page , paging_tree, true);
|
||||||
|
|
||||||
memcpy( (void*)page, (void*)virt, 4096);
|
memcpy( (void*)page, (void*)virt, 4096);
|
||||||
Syscall::Skeleton::invlpg(virt);
|
Syscall::Skeleton::invlpg(virt);
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ void* getFreeVirtSpace(four_lvl_paging_t* search_table, uint8_t num_pages){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t writeable){
|
void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, bool write){
|
||||||
uint16_t l4Index = (vaddr>>39) & 0x1FF;
|
uint16_t l4Index = (vaddr>>39) & 0x1FF;
|
||||||
uint16_t l3Index = (vaddr>>30) & 0x1FF;
|
uint16_t l3Index = (vaddr>>30) & 0x1FF;
|
||||||
uint16_t l2Index = (vaddr>>21) & 0x1FF;
|
uint16_t l2Index = (vaddr>>21) & 0x1FF;
|
||||||
@@ -195,7 +195,7 @@ void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t w
|
|||||||
memset(newl1, 0, 4096);
|
memset(newl1, 0, 4096);
|
||||||
lvl2->entries[l2Index] = {
|
lvl2->entries[l2Index] = {
|
||||||
.present = 1,
|
.present = 1,
|
||||||
.write = 1,
|
.write = write,
|
||||||
.user = 1,
|
.user = 1,
|
||||||
.address = (uintptr_t)newl1 >> 12
|
.address = (uintptr_t)newl1 >> 12
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ typedef struct {
|
|||||||
void write_identity_map(pagetable_t* identity_table, uint64_t size);
|
void write_identity_map(pagetable_t* identity_table, uint64_t size);
|
||||||
void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_identity);
|
void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_identity);
|
||||||
void load_cr3(void* cr3_value);
|
void load_cr3(void* cr3_value);
|
||||||
void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t writeable =1);
|
void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, bool write=true);
|
||||||
uintptr_t isMapped(uintptr_t vaddr, four_lvl_paging_t* flpt);
|
uintptr_t isMapped(uintptr_t vaddr, four_lvl_paging_t* flpt);
|
||||||
void* getFreeVirtSpace(four_lvl_paging_t* search_table, uint8_t num_pages);
|
void* getFreeVirtSpace(four_lvl_paging_t* search_table, uint8_t num_pages);
|
||||||
void copy_pagetable(four_lvl_paging_t* parent_table, four_lvl_paging_t* child_table);
|
void copy_pagetable(four_lvl_paging_t* parent_table, four_lvl_paging_t* child_table);
|
||||||
|
|||||||
@@ -296,10 +296,14 @@ int fork(Vault &vault, InterruptContext *user_context) {
|
|||||||
copy_stack(parent, child);
|
copy_stack(parent, child);
|
||||||
|
|
||||||
child->StackPointer.user = (void*)user_context->sp;
|
child->StackPointer.user = (void*)user_context->sp;
|
||||||
|
vault.thread_list[child->id] = child;
|
||||||
|
|
||||||
|
//return parent pid to child
|
||||||
|
prepareContext(child->StackPointer.isr, child->context, Thread::kickoff, reinterpret_cast<uintptr_t>(child), parent->id, 0);
|
||||||
vault.scheduler.ready(child);
|
vault.scheduler.ready(child);
|
||||||
|
|
||||||
return 0;
|
// return child pid to parent
|
||||||
|
return child->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,12 @@ extern pagetable_t identity_table;
|
|||||||
void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) {
|
void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) {
|
||||||
Thread *thread = reinterpret_cast<Thread *>(param1);
|
Thread *thread = reinterpret_cast<Thread *>(param1);
|
||||||
assert(thread != nullptr && "Kickoff got nullptr pointer to Thread");
|
assert(thread != nullptr && "Kickoff got nullptr pointer to Thread");
|
||||||
(void)param2; // will be used later
|
|
||||||
(void)param3; // will be used later
|
(void)param3; // will be used later
|
||||||
// The core must have entered level 1/2 to cause a thread to be scheduled.
|
// The core must have entered level 1/2 to cause a thread to be scheduled.
|
||||||
Guard::leave();
|
Guard::leave();
|
||||||
|
|
||||||
if(!thread->isKernel)
|
if(!thread->isKernel)
|
||||||
Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, 0);
|
Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, (void*)param2);
|
||||||
else
|
else
|
||||||
if(thread->start == nullptr)
|
if(thread->start == nullptr)
|
||||||
thread->action();
|
thread->action();
|
||||||
|
|||||||
@@ -75,11 +75,11 @@ class Thread {
|
|||||||
* \param param3 Third parameter (will be used later)
|
* \param param3 Third parameter (will be used later)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static void kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3);
|
|
||||||
|
|
||||||
static void kickoffUsermode (Thread *object);
|
static void kickoffUsermode (Thread *object);
|
||||||
void map_app(void* code_paddr, uint16_t code_page_num, void* stack_vaddr, uint16_t stack_page_num);
|
void map_app(void* code_paddr, uint16_t code_page_num, void* stack_vaddr, uint16_t stack_page_num);
|
||||||
public:
|
public:
|
||||||
|
static void kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3);
|
||||||
struct{
|
struct{
|
||||||
void* user;
|
void* user;
|
||||||
void* isr;
|
void* isr;
|
||||||
|
|||||||
@@ -45,19 +45,26 @@ extern "C" void main() {
|
|||||||
|
|
||||||
//sys_test(1,2,3,4,5);
|
//sys_test(1,2,3,4,5);
|
||||||
|
|
||||||
fork();
|
uint8_t ret = fork();
|
||||||
|
//ret = fork();
|
||||||
|
|
||||||
unsigned id = sys_getpid();
|
unsigned id = sys_getpid();
|
||||||
|
|
||||||
char text[] = "appX";
|
char text[] = "appX";
|
||||||
text[3] = 0x30+id;
|
text[3] = 0x30+id;
|
||||||
write(1, text, sizeof(text), 0, (int)id);
|
write(1, text, strlen(text), 0, (int)id);
|
||||||
|
|
||||||
|
char msg[] = "forked pid: ";
|
||||||
|
msg[12] = 0x30+ret;
|
||||||
|
write(1, msg, strlen(msg), 6, (int)id);
|
||||||
|
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
cnt = (cnt+1)%100;
|
cnt = (cnt+1)%100;
|
||||||
char msg[12];
|
char msg[12];
|
||||||
char* num = itoa(cnt, msg);
|
char* num = itoa(cnt, msg);
|
||||||
write(1, num, strlen(num), 10, (int)id);
|
write(1, num, strlen(num), 25, (int)id);
|
||||||
sleep(100);
|
sleep(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user