forked from xamidev/pepperOS
Fixed kbd (buffer flush)
This commit is contained in:
@@ -151,12 +151,13 @@ vector_7_handler:
|
|||||||
align 16
|
align 16
|
||||||
vector_8_handler:
|
vector_8_handler:
|
||||||
; No error code, we only push vector number
|
; No error code, we only push vector number
|
||||||
push qword 1
|
push qword 8
|
||||||
jmp interrupt_stub
|
jmp interrupt_stub
|
||||||
|
|
||||||
; Coprocessor Segment Overrun
|
; Coprocessor Segment Overrun
|
||||||
align 16
|
align 16
|
||||||
vector_9_handler:
|
vector_9_handler:
|
||||||
|
push qword 0
|
||||||
push qword 9
|
push qword 9
|
||||||
jmp interrupt_stub
|
jmp interrupt_stub
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ void idt_init()
|
|||||||
{
|
{
|
||||||
// We set 256 entries, but we have only the first few stubs.
|
// We set 256 entries, but we have only the first few stubs.
|
||||||
// Undefined behavior?
|
// Undefined behavior?
|
||||||
for (size_t i=0; i<256; i++)
|
for (size_t i=0; i<=33; i++)
|
||||||
{
|
{
|
||||||
// Each vector handler is 16-byte aligned, so <vector_no>*16 = address of that handler
|
// Each vector handler is 16-byte aligned, so <vector_no>*16 = address of that handler
|
||||||
idt_set_entry(i, vector_0_handler + (i*16), 0);
|
idt_set_entry(i, vector_0_handler + (i*16), 0);
|
||||||
@@ -210,6 +210,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context)
|
|||||||
case 33:
|
case 33:
|
||||||
DEBUG("Keyboard Interrupt");
|
DEBUG("Keyboard Interrupt");
|
||||||
keyboard_handler();
|
keyboard_handler();
|
||||||
|
outb(0x20, 0x20);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -176,9 +176,6 @@ void keyboard_handler()
|
|||||||
key_status &= ~ALT_PRESSED_BIT;
|
key_status &= ~ALT_PRESSED_BIT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send EOI
|
|
||||||
outb(0x20, 0x20);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -199,6 +196,9 @@ void keyboard_handler()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
{
|
||||||
|
// Avoiding buffer overflow from extended keys lol
|
||||||
|
if (scancode < 128)
|
||||||
{
|
{
|
||||||
// Should we get a SHIFTED char or a regular one?
|
// Should we get a SHIFTED char or a regular one?
|
||||||
unsigned char c = (key_status & SHIFT_PRESSED_BIT) ? keymap_shifted[scancode] : keymap[scancode];
|
unsigned char c = (key_status & SHIFT_PRESSED_BIT) ? keymap_shifted[scancode] : keymap[scancode];
|
||||||
@@ -211,9 +211,7 @@ void keyboard_handler()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// End of Interrupt (to master PIC)
|
|
||||||
outb(0x20, 0x20);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyboard_init(unsigned char layout)
|
void keyboard_init(unsigned char layout)
|
||||||
@@ -233,10 +231,16 @@ void keyboard_init(unsigned char layout)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
skputs("Unsupported layout.");
|
panic(NULL, "Unsupported keyboard layout");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flush keyboard buffer
|
||||||
|
while (inb(0x64) & 1)
|
||||||
|
{
|
||||||
|
inb(0x60);
|
||||||
|
}
|
||||||
|
|
||||||
// Unmask IRQ1
|
// Unmask IRQ1
|
||||||
uint8_t mask = inb(0x21);
|
uint8_t mask = inb(0x21);
|
||||||
mask &= ~(1 << 1);
|
mask &= ~(1 << 1);
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ static int is_transmit_empty()
|
|||||||
// Serial kernel putchar
|
// Serial kernel putchar
|
||||||
void skputc(char c)
|
void skputc(char c)
|
||||||
{
|
{
|
||||||
|
// TODO: Spinlock here (serial access)
|
||||||
while (!is_transmit_empty()); // wait for free spot
|
while (!is_transmit_empty()); // wait for free spot
|
||||||
outb(PORT, c);
|
outb(PORT, c);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ extern struct flanterm_context* ft_ctx;
|
|||||||
// Overhead that could be avoided, right? (for printf)
|
// Overhead that could be avoided, right? (for printf)
|
||||||
void _putchar(char character)
|
void _putchar(char character)
|
||||||
{
|
{
|
||||||
|
// TODO: Spinlock here (terminal access)
|
||||||
flanterm_write(ft_ctx, &character, 1);
|
flanterm_write(ft_ctx, &character, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user