diff --git a/include/context.h b/include/context.h index f4822681f2f5595e7d4a01631789a822091d0eae..f922730835f0abd2419dc4c92097e05003c0cf03 100644 --- a/include/context.h +++ b/include/context.h @@ -4,6 +4,8 @@ #define STACK_SIZE 16384 #define CTX_MAX 16 +#define SEM_MAGIC 0xCAFEBABE + typedef int(func_t)(int); typedef void(funct_t)(void *); diff --git a/include/utils.h b/include/utils.h index d3fd72084a1a36b97717f003826cc805daa17214..af50f152c0ac1cd9f36756a4a6c92376ec1d3a2a 100644 --- a/include/utils.h +++ b/include/utils.h @@ -10,6 +10,7 @@ void putc(char aChar); /* print a single char on screen */ void puts(const char *aString); /* print a string on the screen */ void puthex(int aNumber); /* print an Hex number on screen */ void assert0(char b, const char *filename, const char *fct_name, const int line); + void irq_disable(); void irq_enable(); diff --git a/src/main.c b/src/main.c index 448477b47a50327e054a28fe03800f22fa06d3d7..f597cf8d0cbb7f7a7865eb2fadb71c3da19de127 100644 --- a/src/main.c +++ b/src/main.c @@ -1,16 +1,22 @@ +#include "idt.h" #include "ioport.h" #include "gdt.h" -#include "idt.h" -#include "keyboard.h" #include "utils.h" #include "context.h" +#include "sem.h" +#include "keyboard.h" -/* print a char on the screen */ -int cursor_x = 0; /* here is the cursor position on X [0..79] */ -int cursor_y = 0; /* here is the cursor position on Y [0..24] */ +extern int cursor_x; +extern int cursor_y; int counter = 0; +ctx_t *ping_ctx = NULL; +ctx_t *pong_ctx = NULL; + +sem_t sping; +sem_t spong; + void empty_irq(int_regs_t *r) { } @@ -57,6 +63,30 @@ void keyboard_handler(void *args) } } +void ping(void *arg) +{ + while (1) + { + puts("PING\n"); + for (int i = 0; i < 100000000; i++) + ; + sem_up(&spong); + sem_down(&sping); + } +} + +void pong(void *arg) +{ + while (1) + { + puts("PONG\n"); + for (int i = 0; i < 100000000; i++) + ; + sem_up(&sping); + sem_down(&spong); + } +} + /* multiboot entry-point with datastructure as arg. */ void main(unsigned int *mboot_info) { @@ -73,7 +103,7 @@ void main(unsigned int *mboot_info) puts("\n\n"); - idt_setup_handler(0, timer_it); + idt_setup_handler(0, empty_irq); idt_setup_handler(1, empty_irq); __asm volatile("sti"); @@ -82,122 +112,15 @@ void main(unsigned int *mboot_info) puts("Hello world\n\n"); - ctx_t *ctx1 = create_ctx(counter_handler, NULL); - ctx_t *ctx2 = create_ctx(keyboard_handler, NULL); - - for (;;) - ; /* nothing more to do... really nothing ! */ -} - -void assert0(char b, const char *filename, const char *fct_name, const int line) -{ - if (!b) - { - puts("Assertion error in "); - puts(filename); - puts(" in "); - puts(fct_name); - puts(" at 0x"); - puthex(line); - puts("\n"); - } -} - -void irq_disable() -{ - __asm volatile("cli"); -} - -void irq_enable() -{ - __asm volatile("sti"); - _outb(0xA0, 0x20); - _outb(0x20, 0x20); -} - -/* base address for the video output assume to be set as character oriented by the multiboot */ -unsigned char *video_memory = (unsigned char *)0xB8000; - -/* clear screen */ -void clear_screen() -{ - int i; - for (i = 0; i < 80 * 25; i++) - { /* for each one of the 80 char by 25 lines */ - video_memory[i * 2 + 1] = 0x0F; /* color is set to black background and white char */ - video_memory[i * 2] = (unsigned char)' '; /* character shown is the space char */ - } -} + sem_init(&sping, -1); + sem_init(&spong, 0); -/* print a string on the screen */ -void puts(const char *aString) -{ - const char *current_char = aString; - while (*current_char != 0) - { - putc(*current_char++); - } -} + ctx_t *ping_ctx = create_ctx(ping, NULL); + ctx_t *pong_ctx = create_ctx(pong, NULL); -/* print an number in hexa */ -char *hex_digit = "0123456789ABCDEF"; -void puthex(int aNumber) -{ - int i; - int started = 0; - for (i = 28; i >= 0; i -= 4) - { - int k = (aNumber >> i) & 0xF; - if (k != 0 || started) - { - putc(hex_digit[k]); - started = 1; - } - } -} - -void setCursor() -{ - int cursor_offset = cursor_x + cursor_y * 80; - _outb(0x3d4, 14); - _outb(0x3d5, ((cursor_offset >> 8) & 0xFF)); - _outb(0x3d4, 15); - _outb(0x3d5, (cursor_offset & 0xFF)); -} + //sem_down(&sping); + yield(); -void putc(char c) -{ - if (cursor_x > 79) - { - cursor_x = 0; - cursor_y++; - } - if (cursor_y > 24) - { - cursor_y = 0; - clear_screen(); - } - switch (c) - { /* deal with a special char */ - case '\r': - cursor_x = 0; - break; /* carriage return */ - case '\n': - cursor_x = 0; - cursor_y++; - break; /* new ligne */ - case 0x8: - if (cursor_x > 0) - cursor_x--; - break; /* backspace */ - case 0x9: - cursor_x = (cursor_x + 8) & ~7; - break; /* tabulation */ - /* or print a simple character */ - default: - video_memory[(cursor_x + 80 * cursor_y) * 2] = c; - cursor_x++; - break; - } - setCursor(); + for (;;) + ; /* nothing more to do... really nothing ! */ } diff --git a/src/sem.c b/src/sem.c index 402aae85ebb313a1efd3b0f790891f3187587836..327cd58b5ba0d2026d722593b57541d7abcff9b9 100644 --- a/src/sem.c +++ b/src/sem.c @@ -42,4 +42,4 @@ void sem_down(sem_t *sem) yield(); } irq_enable(); -} +} \ No newline at end of file