umka_os: route virtual device IRQs via IDT

This commit is contained in:
Ivan Baravy 2023-01-18 02:58:09 +00:00
parent da8f029e5d
commit 53683cf146
5 changed files with 106 additions and 15 deletions

View File

@ -17,6 +17,19 @@ start:
btr dword[esp], BSF EFLAGS.ID
popfd
mcall 12, 1
mcall 0, <100,200>, <100,100>, 0x34888888, , window_title
mcall 12, 2
mcall 18, 19, 4, 0
.next:
mcall 37, 0
add eax, 0x00030003
mov edx, eax
mcall 18, 19, 4
mcall 5, 1
; mov ecx, 0x1000000
; loopnz $
jmp .next
DEBUGF 1, "abcde\n"
mcall 70, fs70
DEBUGF 1, "files in dir: %d\n", ebx
@ -37,6 +50,8 @@ fs70:
dd dir_name
dir_name db '/hd0/1/',0
window_title db 'readdir test',0
i_end:
dir_buf:
rb 0x10000

View File

@ -85,6 +85,7 @@ UMKA_OS = 3
UMKA_MEMORY_BYTES = 256 SHL 20
pubsym irq_serv.irq_10, 'kos_irq_serv_irq10'
pubsym idts, 'kos_idts'
pubsym attach_int_handler, 'kos_attach_int_handler', 12
pubsym fs_execute, 'kos_fs_execute', 4
pubsym set_keyboard_data, 'kos_set_keyboard_data'
@ -188,6 +189,9 @@ pubsym BOOT, 'kos_boot'
EFLAGS.ID = 1 SHL 21
macro lidt x {
}
macro invlpg addr {
}
@ -264,6 +268,15 @@ page_tabs equ page_tabs_pew
;macro OS_BASE [x] {
; OS_BASE equ os_base
;}
struct idt_entry
addr_lo dw ?
seg dw ?
flags dw ?
addr_hi dw ?
ends
NUM_EXCEPTIONS = 32
macro tss pew {}
include 'const.inc'
purge tss
@ -630,6 +643,8 @@ proc kos_init uses ebx esi edi ebp
mov [pg_data.kernel_pages], eax
shr eax, 10
mov [pg_data.kernel_tables], eax
call build_interrupt_table
call init_kernel_heap
call init_malloc
@ -948,7 +963,6 @@ mtrr_validate:
;unprotect_from_terminate:
;lock_application_table:
;unlock_application_table:
;build_interrupt_table:
;sys_resize_app_memory:
;request_terminate:
v86_exc_c:
@ -1073,7 +1087,7 @@ align 64
os_base: rb PAGE_SIZE
window_data: rb sizeof.WDATA * 256
CDDataBuf: rb 0x1000
idts rb IRQ_RESERVED * 8 ; IDT descriptor is 8 bytes long
idts rb (NUM_EXCEPTIONS + IRQ_RESERVED) * sizeof.idt_entry
WIN_STACK rw 0x200 ; why not 0x100?
WIN_POS rw 0x200
FDD_BUFF: rb 0x400

44
umka.h
View File

@ -591,8 +591,19 @@ umka_mouse_move(int lbheld, int mbheld, int rbheld, int xabs, int32_t xmoving,
STDCALL net_buff_t *
kos_net_buff_alloc(size_t size);
struct idt_entry {
uint16_t addr_lo;
uint16_t segment;
uint16_t flags;
uint16_t addr_hi;
};
typedef int (*hw_int_handler_t)(void*);
extern struct idt_entry kos_idts[];
STDCALL void
kos_attach_int_handler(int irq, int (*handler)(void*), void *user_data);
kos_attach_int_handler(int irq, hw_int_handler_t handler, void *userdata);
void
kos_irq_serv_irq10(void);
@ -621,23 +632,34 @@ static inline void*
kos_destroy_event(void *event, uint32_t uid) {
void *ret;
__asm__ __inline__ __volatile__ (
"push ebx esi edi ebp;"
"push ebx;"
"push esi;"
"push edi;"
"push ebp;"
"call _kos_destroy_event;"
"pop ebp edi esi ebx"
"pop ebp;"
"pop edi;"
"pop esi;"
"pop ebx"
: "=a"(ret)
: "a"(event),
"b"(uid)
: "memory", "cc");
return ret;
}
static inline void
kos_wait_event(void *event, uint32_t uid) {
__asm__ __inline__ __volatile__ (
"push ebx esi edi ebp;"
"push ebx;"
"push esi;"
"push edi;"
"push ebp;"
"call _kos_wait_event;"
"pop ebp edi esi ebx"
"pop ebp;"
"pop edi;"
"pop esi;"
"pop ebx"
:
: "a"(event),
"b"(uid)
@ -650,9 +672,15 @@ static inline void*
kos_wait_events(wait_test_t wait_test, void *wait_param) {
void *res;
__asm__ __inline__ __volatile__ (
"push ebx esi edi ebp;"
"push %%ebx;"
"push %%esi;"
"push %%edi;"
"push %%ebp;"
"call _kos_wait_events;"
"pop ebp edi esi ebx"
"pop %%ebp;"
"pop %%edi;"
"pop %%esi;"
"pop %%ebx"
: "=a"(res)
: "c"(wait_param),
"d"(wait_test)

View File

@ -42,6 +42,13 @@ struct umka_os_ctx {
char history_filename[PATH_MAX];
static int
hw_int_mouse(void *arg) {
(void)arg;
kos_set_mouse_data(0, -50, 50, 0, 0);
return 1; // our interrupt
}
struct umka_os_ctx *
umka_os_init() {
struct umka_os_ctx *ctx = malloc(sizeof(struct umka_os_ctx));
@ -115,15 +122,18 @@ load_app_host(const char *fname, void *base) {
return 0;
}
int
/*
static int
load_app(const char *fname) {
int32_t result = umka_fs_execute(fname);
printf("result: %" PRIi32 "\n", result);
return result;
}
*/
void handle_i40(int signo, siginfo_t *info, void *context) {
static void
handle_i40(int signo, siginfo_t *info, void *context) {
(void)signo;
(void)info;
ucontext_t *ctx = context;
@ -136,13 +146,25 @@ void handle_i40(int signo, siginfo_t *info, void *context) {
umka_i40((pushad_t*)(ctx->uc_mcontext.__gregs + REG_EDI));
}
void handle_irq_net(int signo, siginfo_t *info, void *context) {
static void
handle_irq_net(int signo, siginfo_t *info, void *context) {
(void)signo;
(void)info;
(void)context;
kos_irq_serv_irq10();
}
static void
hw_int(int signo, siginfo_t *info, void *context) {
(void)signo;
(void)context;
struct idt_entry *e = kos_idts + info->si_value.sival_int + 0x20;
void (*handler)(void) = (void(*)(void)) (((uintptr_t)e->addr_hi << 16)
+ e->addr_lo);
handler();
umka_sti();
}
int
main(int argc, char *argv[]) {
(void)argc;
@ -214,6 +236,15 @@ main(int argc, char *argv[]) {
return 1;
}
sa.sa_sigaction = hw_int;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGUSR2, &sa, NULL) == -1) {
fprintf(stderr, "Can't install SIGUSR2 handler!\n");
return 1;
}
struct app_hdr *app = mmap(KOS_APP_BASE, 16*0x100000, PROT_READ | PROT_WRITE
| PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (app == MAP_FAILED) {
@ -274,6 +305,8 @@ main(int argc, char *argv[]) {
}
*/
kos_attach_int_handler(14, hw_int_mouse, NULL);
// thread_start(0, monitor, THREAD_STACK_SIZE);
kos_thread_t start = (kos_thread_t)(KOS_APP_BASE + app->menuet.start);
thread_start(0, start, THREAD_STACK_SIZE);

View File

@ -1,3 +1,4 @@
umka_init umka_os
umka_init os
ramdisk_init ../img/kolibri.raw
set_skin /sys/DEFAULT.SKN
disk_add ../img/xfs_samehash_s05k.raw hd0 -c 0