more interrupt work

This commit is contained in:
Benji Dial 2025-12-20 16:20:17 -05:00
parent 45c4c1d1e1
commit d37fa101f4
7 changed files with 155 additions and 8 deletions

View file

@ -0,0 +1,23 @@
/* Calcite, kernel/include/framebuffer.h
* Copyright 2025 Benji Dial
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <stdint.h>
extern uint8_t *fb_base;
extern int fb_width;
extern int fb_height;
extern int fb_pitch;

20
kernel/include/keyboard.h Normal file
View file

@ -0,0 +1,20 @@
/* Calcite, kernel/include/keyboard.h
* Copyright 2025 Benji Dial
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
void on_keyboard_irq();

View file

@ -15,7 +15,9 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <framebuffer.h>
#include <interrupts.h> #include <interrupts.h>
#include <keyboard.h>
#include <utility.h> #include <utility.h>
#include <initfs.h> #include <initfs.h>
#include <limine.h> #include <limine.h>
@ -75,11 +77,6 @@ static void map_kernel_region(
physical_start + i, (uint8_t *)virtual_start + i, writable, executable); physical_start + i, (uint8_t *)virtual_start + i, writable, executable);
} }
static uint8_t *fb_base;
static int fb_width;
static int fb_height;
static int fb_pitch;
static uint8_t *initfs_start; static uint8_t *initfs_start;
static uint64_t initfs_length; static uint64_t initfs_length;
@ -179,11 +176,17 @@ static uint64_t initfs_length;
[[noreturn]] static void with_kernel_page_tables() { [[noreturn]] static void with_kernel_page_tables() {
//further initialization //set initfs
set_initfs(initfs_start, initfs_length); set_initfs(initfs_start, initfs_length);
//set up interrupts
set_irq_handler(0x01, &on_keyboard_irq);
enable_interrupts(); enable_interrupts();
//halt repeatedly
while (1) while (1)
__asm__ ("hlt"); __asm__ ("hlt");

23
kernel/src/framebuffer.c Normal file
View file

@ -0,0 +1,23 @@
/* Calcite, kernel/src/framebuffer.c
* Copyright 2025 Benji Dial
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <framebuffer.h>
uint8_t *fb_base;
int fb_width;
int fb_height;
int fb_pitch;

View file

@ -192,8 +192,8 @@ void enable_interrupts_asm(
void enable_interrupts() { void enable_interrupts() {
the_tss.ist1 = (uint64_t)&interrupt_stack_one; the_tss.ist1 = (uint64_t)interrupt_stack_one + INTERRUPT_STACK_SIZE;
the_tss.ist2 = (uint64_t)&interrupt_stack_two; the_tss.ist2 = (uint64_t)interrupt_stack_two + INTERRUPT_STACK_SIZE;
//having the table past the end of the tss will lead to a gpf when the //having the table past the end of the tss will lead to a gpf when the
//cpu tries to access it, which is the same effect as a disabled port. //cpu tries to access it, which is the same effect as a disabled port.

38
kernel/src/keyboard.asm Normal file
View file

@ -0,0 +1,38 @@
; Calcite, kernel/src/paging.asm
; Copyright 2025 Benji Dial
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or (at
; your option) any later version.
;
; This program is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
; more details.
;
; You should have received a copy of the GNU General Public License along with
; this program. If not, see <https://www.gnu.org/licenses/>.
bits 64
section .text
;referenced in keyboard.c
;return type is int
;returns -1 if no byte available
global read_keyboard_byte
read_keyboard_byte:
in al, 0x64
test al, 0x01
jz .no_data
xor eax, eax
in al, 0x60
ret
.no_data:
mov eax, -1
ret

40
kernel/src/keyboard.c Normal file
View file

@ -0,0 +1,40 @@
/* Calcite, kernel/src/keyboard.c
* Copyright 2025 Benji Dial
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <framebuffer.h>
#include <keyboard.h>
//defined in keyboard.asm
//returns -1 if no byte available
int read_keyboard_byte();
static uint32_t color = 1;
void on_keyboard_irq() {
while (read_keyboard_byte() != -1)
;
color ^= color << 13;
color ^= color >> 17;
color ^= color << 5;
for (int y = 0; y < fb_height; ++y)
for (int x = 0; x < fb_width; ++x)
*(uint32_t *)&fb_base[y * fb_pitch + x * 4] = color & 0x00ffffff;
}