From d1532c8483b6c6b30127ba9759733ce8cf692387 Mon Sep 17 00:00:00 2001
From: Bah Thierno-Souleymane <thiernosouleymane.bah.etu@univ-lille.fr>
Date: Tue, 20 Apr 2021 01:14:01 +0200
Subject: [PATCH] feat(Two contexts demonstration done)
---
src/main.c | 106 ++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 81 insertions(+), 25 deletions(-)
diff --git a/src/main.c b/src/main.c
index bda70a6..448477b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,16 +2,61 @@
#include "gdt.h"
#include "idt.h"
#include "keyboard.h"
+#include "utils.h"
+#include "context.h"
-void clear_screen(); /* clear screen */
-void putc(char aChar); /* print a single char on screen */
-void puts(char *aString); /* print a string on the screen */
-void puthex(int aNumber); /* print an Hex number on screen */
+/* 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] */
+
+int counter = 0;
void empty_irq(int_regs_t *r)
{
}
+void timer_it(int_regs_t *r)
+{
+ yield();
+}
+
+void counter_handler(void *args)
+{
+ while (1)
+ {
+ irq_disable();
+ int tmp_cursor[2] = {cursor_x, cursor_y};
+ cursor_x = 70;
+ cursor_y = 0;
+
+ puthex(counter++);
+
+ cursor_x = tmp_cursor[0];
+ cursor_y = tmp_cursor[1];
+
+ irq_enable();
+ }
+}
+
+void keyboard_handler(void *args)
+{
+ init_keymapping();
+ while (1)
+ {
+ irq_disable();
+ if (_inb(0x64) == (0x1D))
+ {
+ _outb(0x64, 0x1C);
+ unsigned char s = _inb(0x60);
+ char c = keyboard_map(s);
+ if (c)
+ putc(c);
+ // puthex(s);
+ }
+ irq_enable();
+ }
+}
+
/* multiboot entry-point with datastructure as arg. */
void main(unsigned int *mboot_info)
{
@@ -28,8 +73,8 @@ void main(unsigned int *mboot_info)
puts("\n\n");
- idt_setup_handler(0, empty_irq);
- idt_setup_handler(0, empty_irq);
+ idt_setup_handler(0, timer_it);
+ idt_setup_handler(1, empty_irq);
__asm volatile("sti");
@@ -37,24 +82,39 @@ void main(unsigned int *mboot_info)
puts("Hello world\n\n");
- init_keymapping();
- while (1)
- {
- if (_inb(0x64) == (0x1D))
- {
- _outb(0x64, 0x1C);
- unsigned char s = _inb(0x60);
- char c = keyboard_map(s);
- if (c)
- putc(c);
- // puthex(s);
- }
- }
+ 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;
@@ -70,9 +130,9 @@ void clear_screen()
}
/* print a string on the screen */
-void puts(char *aString)
+void puts(const char *aString)
{
- char *current_char = aString;
+ const char *current_char = aString;
while (*current_char != 0)
{
putc(*current_char++);
@@ -96,10 +156,6 @@ void puthex(int aNumber)
}
}
-/* 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] */
-
void setCursor()
{
int cursor_offset = cursor_x + cursor_y * 80;
--
GitLab