Store size of message in buffer

This commit is contained in:
pjht 2019-06-22 15:29:02 -05:00
parent 7ee2472fe5
commit 1216d4c000
9 changed files with 25 additions and 16 deletions

View File

@ -28,16 +28,16 @@ debug: os.iso kernel/kernel.elf
@$(EMU) -s $(QFLAGS) &
@$(GDB) -ex "target remote localhost:1234" -ex "symbol-file kernel/kernel.elf"
os.iso: kernel/kernel.elf initrd/* initrd/init initrd/vfs
os.iso: kernel/kernel.elf init vfs initrd/*
@cp kernel/kernel.elf iso/boot
@cd initrd; tar -f ../iso/boot/initrd.tar -c *
@grub-mkrescue -o $@ iso
initrd/init: init/* kernel/start.o
init: init/* kernel/start.o
@cd init && make
@cp init/init initrd/init
initrd/vfs: vfs/* kernel/start.o
vfs: vfs/* kernel/start.o
@cd vfs && make
@cp vfs/vfs initrd/vfs

View File

@ -88,13 +88,18 @@ int main(char* initrd, uint32_t initrd_sz) {
vga_write_string("Loaded VFS into memory, creating task\n");
createTaskCr3((void*)header.entry,cr3);
vga_write_string("Created VFS task, sending test message\n");
send_msg(2,"hi",3);
send_msg(2,"hello",6);
vga_write_string("Sent test message, yielding to task\n");
yield();
vga_write_string("Yielded and got control, getting message\n");
int sender=&sender;
char* msg=get_msg(&sender);
vga_write_string("Message: ");
int sender;
int size;
char* msg=get_msg(&sender,&size);
vga_write_string("Message of size ");
char str[256];
int_to_ascii(size,str);
vga_write_string(str);
vga_write_string(": ");
vga_write_string(msg);
vga_write_string("\n");
}

View File

@ -186,7 +186,7 @@ void isr_handler(registers_t r) {
} else if (r.eax==5) {
r.ebx=(uint32_t)tasking_get_errno_address();
} else if (r.eax==6) {
r.ebx=(uint32_t)tasking_get_msg((uint32_t*)r.ebx);
r.ebx=(uint32_t)tasking_get_msg((uint32_t*)r.ebx,(uint32_t*)r.ecx);
} else if (r.eax==7) {
tasking_send_msg(r.ebx,(void*)r.ecx,r.edx);
} else if (r.eax==8) {

View File

@ -120,6 +120,7 @@ void tasking_send_msg(uint32_t pid,char* msg,uint32_t size) {
}
task->msg_store[task->wr]=data;
task->sender_store[task->wr]=currentTask->pid;
task->size_store[task->wr]=size;
task->wr++;
if (task->wr==16) {
task->wr=0;
@ -135,7 +136,7 @@ void tasking_send_msg(uint32_t pid,char* msg,uint32_t size) {
}
}
void* tasking_get_msg(uint32_t* sender) {
void* tasking_get_msg(uint32_t* sender,uint32_t* size) {
if (!currentTask->msg_store) {
return NULL;
}
@ -153,6 +154,7 @@ void* tasking_get_msg(uint32_t* sender) {
}
}
*sender=currentTask->sender_store[currentTask->rd];
*size=currentTask->size_store[currentTask->rd];
char* data=currentTask->msg_store[currentTask->rd];
currentTask->msg_store[currentTask->rd]=NULL;
currentTask->sender_store[currentTask->rd]=0;

View File

@ -14,6 +14,7 @@ typedef struct Task {
uint32_t pid;
char* msg_store[16];
uint32_t sender_store[16];
uint32_t size_store[16];
uint8_t rd;
uint8_t wr;
struct Task* next;

View File

@ -10,5 +10,5 @@ Task* tasking_createTask(void* eip);
Task* tasking_createTaskCr3(void* eip,void* cr3);
char isPrivleged(uint32_t pid);
void tasking_send_msg(uint32_t pid,char* msg,uint32_t size);
void* tasking_get_msg(uint32_t* sender);
void* tasking_get_msg(uint32_t* sender,uint32_t* size);
#endif

View File

@ -14,12 +14,12 @@ void createTask(void* task) {
"::"b"(task));
}
void* get_msg(uint32_t* sender) {
void* get_msg(uint32_t* sender,uint32_t* size) {
void* msg;
asm volatile(" \
mov $6, %%eax; \
int $80; \
":"=b"(msg):"b"(sender));
":"=b"(msg):"b"(sender),"c"(size));
return msg;
}

View File

@ -9,6 +9,6 @@ void createTaskCr3(void* task,void* cr3);
void createTaskCr3Param(void* task,void* cr3,uint32_t param1,uint32_t param2);
char isPrivleged(uint32_t pid);
void send_msg(uint32_t pid,void* msg,uint32_t size);
void* get_msg(uint32_t* sender);
void* get_msg(uint32_t* sender,uint32_t* size);
#endif

View File

@ -1,9 +1,10 @@
#include <tasking.h>
int main() {
int sender=&sender;
char* msg=get_msg(&sender);
send_msg(1,msg,3);
int sender;
int size;
char* msg=get_msg(&sender,&size);
send_msg(1,msg,size);
yield();
for (;;);
}