fork return value

This commit is contained in:
2026-02-25 14:44:18 +01:00
parent 8b271e2470
commit b958e9461e
5 changed files with 18 additions and 8 deletions

View File

@@ -26,7 +26,7 @@ void switchToUsermode(void *stackpointer, void *kickoff,
"pushq %[user_eflags] \n" \
"pushq %[user_code] \n" \
"pushq %[user_function] \n" \
"mov %[user_parameter], %%rdi\n" \
"mov %[user_parameter], %%rax\n" \
"iretq \n" \
: \
: [user_data] "r"((uint64_t)user_ds),

View File

@@ -296,10 +296,14 @@ int fork(Vault &vault, InterruptContext *user_context) {
copy_stack(parent, child);
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);
return 0;
// return child pid to parent
return child->id;
}

View File

@@ -16,13 +16,12 @@ extern pagetable_t identity_table;
void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) {
Thread *thread = reinterpret_cast<Thread *>(param1);
assert(thread != nullptr && "Kickoff got nullptr pointer to Thread");
(void)param2; // 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.
Guard::leave();
if(!thread->isKernel)
Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, 0);
Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, (void*)param2);
else
if(thread->start == nullptr)
thread->action();

View File

@@ -75,11 +75,11 @@ class Thread {
* \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);
void map_app(void* code_paddr, uint16_t code_page_num, void* stack_vaddr, uint16_t stack_page_num);
public:
static void kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3);
struct{
void* user;
void* isr;

View File

@@ -45,19 +45,26 @@ extern "C" void main() {
//sys_test(1,2,3,4,5);
fork();
uint8_t ret = fork();
//ret = fork();
unsigned id = sys_getpid();
char text[] = "appX";
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;
while(1){
cnt = (cnt+1)%100;
char msg[12];
char* num = itoa(cnt, msg);
write(1, num, strlen(num), 10, (int)id);
write(1, num, strlen(num), 25, (int)id);
sleep(100);
}