Add yield syscall (Not working in umode)
This commit is contained in:
parent
fdd7afa1c8
commit
4f25ff7a09
@ -3,6 +3,7 @@
|
||||
#include "ports.h"
|
||||
#include "../halt.h"
|
||||
#include "../drivers/vga.h"
|
||||
#include "../tasking.h"
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
void irq_handler(registers_t r);
|
||||
@ -163,6 +164,11 @@ void isr_handler(registers_t r) {
|
||||
// }
|
||||
halt();
|
||||
break;
|
||||
case 80:
|
||||
if (r.eax==1) {
|
||||
tasking_yield();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,11 +16,11 @@ static Task* headTask;
|
||||
void tasking_init() {
|
||||
currentTask=NULL;
|
||||
next_pid=0;
|
||||
headTask=createTask(NULL);
|
||||
headTask=tasking_createTask(NULL);
|
||||
currentTask=headTask;
|
||||
}
|
||||
|
||||
Task* createTaskEax(void* eip,uint32_t eax) {
|
||||
Task* tasking_createTaskEax(void* eip,uint32_t eax) {
|
||||
Task* task=malloc(sizeof(Task));
|
||||
task->regs.eax=eax;
|
||||
task->regs.ebx=0;
|
||||
@ -45,11 +45,11 @@ Task* createTaskEax(void* eip,uint32_t eax) {
|
||||
return task;
|
||||
}
|
||||
|
||||
Task* createTask(void* eip) {
|
||||
return createTaskEax(eip,0);
|
||||
Task* tasking_createTask(void* eip) {
|
||||
return tasking_createTaskEax(eip,0);
|
||||
}
|
||||
|
||||
void send_msg(uint32_t pid,char* msg) {
|
||||
void tasking_send_msg(uint32_t pid,char* msg) {
|
||||
for (Task* task=headTask;task!=NULL;task=task->next) {
|
||||
if (task->pid==pid) {
|
||||
if (task->msg_store==NULL) {
|
||||
@ -66,7 +66,7 @@ void send_msg(uint32_t pid,char* msg) {
|
||||
}
|
||||
}
|
||||
|
||||
char* get_msg(uint32_t* sender) {
|
||||
char* tasking_get_msg(uint32_t* sender) {
|
||||
if (!currentTask->msg_store) {
|
||||
return NULL;
|
||||
}
|
||||
@ -88,7 +88,7 @@ char* get_msg(uint32_t* sender) {
|
||||
return data;
|
||||
}
|
||||
|
||||
void yield() {
|
||||
void tasking_yield() {
|
||||
Task* task=currentTask->next;
|
||||
if (!task) {
|
||||
task=headTask;
|
||||
|
@ -1,10 +1,10 @@
|
||||
#ifndef TASKING_H
|
||||
#define TASKING_H
|
||||
#ifndef CPU_TASKING_H
|
||||
#define CPU_TASKING_H
|
||||
#include "i386/tasking.h"
|
||||
|
||||
void tasking_init();
|
||||
void yield();
|
||||
Task* createTask(void* eip);
|
||||
void send_msg(uint32_t pid,char* msg);
|
||||
char* get_msg(uint32_t* sender);
|
||||
void tasking_yield();
|
||||
Task* tasking_createTask(void* eip);
|
||||
void tasking_send_msg(uint32_t pid,char* msg);
|
||||
char* tasking_get_msg(uint32_t* sender);
|
||||
#endif
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "../drivers/vga.h"
|
||||
#include <grub/text_fb_info.h>
|
||||
#include <stdlib.h>
|
||||
#include <tasking.h>
|
||||
#include "multiboot.h"
|
||||
|
||||
void task() {
|
||||
@ -56,7 +57,7 @@ void kmain(multiboot_info_t* header) {
|
||||
port_byte_out(0xe9,'!');
|
||||
port_byte_out(0xe9,'\n');
|
||||
vga_write_string("Task create\n");
|
||||
createTask(task);
|
||||
tasking_createTask(task);
|
||||
vga_write_string("Task switch\n");
|
||||
yield();
|
||||
vga_write_string("Back in main\n");
|
||||
|
6
libc/tasking.c
Normal file
6
libc/tasking.c
Normal file
@ -0,0 +1,6 @@
|
||||
void yield() {
|
||||
asm volatile(" \
|
||||
mov $1, %eax; \
|
||||
int $80; \
|
||||
");
|
||||
}
|
6
libc/tasking.h
Normal file
6
libc/tasking.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef TASKING_H
|
||||
#define TASKING_H
|
||||
|
||||
void yield();
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user