umka_os: route virtual device IRQs via IDT
This commit is contained in:
parent
da8f029e5d
commit
53683cf146
@ -17,6 +17,19 @@ start:
|
|||||||
btr dword[esp], BSF EFLAGS.ID
|
btr dword[esp], BSF EFLAGS.ID
|
||||||
popfd
|
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"
|
DEBUGF 1, "abcde\n"
|
||||||
mcall 70, fs70
|
mcall 70, fs70
|
||||||
DEBUGF 1, "files in dir: %d\n", ebx
|
DEBUGF 1, "files in dir: %d\n", ebx
|
||||||
@ -37,6 +50,8 @@ fs70:
|
|||||||
dd dir_name
|
dd dir_name
|
||||||
|
|
||||||
dir_name db '/hd0/1/',0
|
dir_name db '/hd0/1/',0
|
||||||
|
window_title db 'readdir test',0
|
||||||
|
|
||||||
i_end:
|
i_end:
|
||||||
dir_buf:
|
dir_buf:
|
||||||
rb 0x10000
|
rb 0x10000
|
||||||
|
18
umka.asm
18
umka.asm
@ -85,6 +85,7 @@ UMKA_OS = 3
|
|||||||
UMKA_MEMORY_BYTES = 256 SHL 20
|
UMKA_MEMORY_BYTES = 256 SHL 20
|
||||||
|
|
||||||
pubsym irq_serv.irq_10, 'kos_irq_serv_irq10'
|
pubsym irq_serv.irq_10, 'kos_irq_serv_irq10'
|
||||||
|
pubsym idts, 'kos_idts'
|
||||||
pubsym attach_int_handler, 'kos_attach_int_handler', 12
|
pubsym attach_int_handler, 'kos_attach_int_handler', 12
|
||||||
pubsym fs_execute, 'kos_fs_execute', 4
|
pubsym fs_execute, 'kos_fs_execute', 4
|
||||||
pubsym set_keyboard_data, 'kos_set_keyboard_data'
|
pubsym set_keyboard_data, 'kos_set_keyboard_data'
|
||||||
@ -188,6 +189,9 @@ pubsym BOOT, 'kos_boot'
|
|||||||
|
|
||||||
EFLAGS.ID = 1 SHL 21
|
EFLAGS.ID = 1 SHL 21
|
||||||
|
|
||||||
|
macro lidt x {
|
||||||
|
}
|
||||||
|
|
||||||
macro invlpg addr {
|
macro invlpg addr {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -264,6 +268,15 @@ page_tabs equ page_tabs_pew
|
|||||||
;macro OS_BASE [x] {
|
;macro OS_BASE [x] {
|
||||||
; OS_BASE equ os_base
|
; 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 {}
|
macro tss pew {}
|
||||||
include 'const.inc'
|
include 'const.inc'
|
||||||
purge tss
|
purge tss
|
||||||
@ -630,6 +643,8 @@ proc kos_init uses ebx esi edi ebp
|
|||||||
mov [pg_data.kernel_pages], eax
|
mov [pg_data.kernel_pages], eax
|
||||||
shr eax, 10
|
shr eax, 10
|
||||||
mov [pg_data.kernel_tables], eax
|
mov [pg_data.kernel_tables], eax
|
||||||
|
|
||||||
|
call build_interrupt_table
|
||||||
call init_kernel_heap
|
call init_kernel_heap
|
||||||
call init_malloc
|
call init_malloc
|
||||||
|
|
||||||
@ -948,7 +963,6 @@ mtrr_validate:
|
|||||||
;unprotect_from_terminate:
|
;unprotect_from_terminate:
|
||||||
;lock_application_table:
|
;lock_application_table:
|
||||||
;unlock_application_table:
|
;unlock_application_table:
|
||||||
;build_interrupt_table:
|
|
||||||
;sys_resize_app_memory:
|
;sys_resize_app_memory:
|
||||||
;request_terminate:
|
;request_terminate:
|
||||||
v86_exc_c:
|
v86_exc_c:
|
||||||
@ -1073,7 +1087,7 @@ align 64
|
|||||||
os_base: rb PAGE_SIZE
|
os_base: rb PAGE_SIZE
|
||||||
window_data: rb sizeof.WDATA * 256
|
window_data: rb sizeof.WDATA * 256
|
||||||
CDDataBuf: rb 0x1000
|
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_STACK rw 0x200 ; why not 0x100?
|
||||||
WIN_POS rw 0x200
|
WIN_POS rw 0x200
|
||||||
FDD_BUFF: rb 0x400
|
FDD_BUFF: rb 0x400
|
||||||
|
46
umka.h
46
umka.h
@ -591,8 +591,19 @@ umka_mouse_move(int lbheld, int mbheld, int rbheld, int xabs, int32_t xmoving,
|
|||||||
STDCALL net_buff_t *
|
STDCALL net_buff_t *
|
||||||
kos_net_buff_alloc(size_t size);
|
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
|
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
|
void
|
||||||
kos_irq_serv_irq10(void);
|
kos_irq_serv_irq10(void);
|
||||||
@ -621,23 +632,34 @@ static inline void*
|
|||||||
kos_destroy_event(void *event, uint32_t uid) {
|
kos_destroy_event(void *event, uint32_t uid) {
|
||||||
void *ret;
|
void *ret;
|
||||||
__asm__ __inline__ __volatile__ (
|
__asm__ __inline__ __volatile__ (
|
||||||
"push ebx esi edi ebp;"
|
"push ebx;"
|
||||||
|
"push esi;"
|
||||||
|
"push edi;"
|
||||||
|
"push ebp;"
|
||||||
"call _kos_destroy_event;"
|
"call _kos_destroy_event;"
|
||||||
"pop ebp edi esi ebx"
|
"pop ebp;"
|
||||||
|
"pop edi;"
|
||||||
|
"pop esi;"
|
||||||
|
"pop ebx"
|
||||||
: "=a"(ret)
|
: "=a"(ret)
|
||||||
: "a"(event),
|
: "a"(event),
|
||||||
"b"(uid)
|
"b"(uid)
|
||||||
: "memory", "cc");
|
: "memory", "cc");
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
kos_wait_event(void *event, uint32_t uid) {
|
kos_wait_event(void *event, uint32_t uid) {
|
||||||
__asm__ __inline__ __volatile__ (
|
__asm__ __inline__ __volatile__ (
|
||||||
"push ebx esi edi ebp;"
|
"push ebx;"
|
||||||
|
"push esi;"
|
||||||
|
"push edi;"
|
||||||
|
"push ebp;"
|
||||||
"call _kos_wait_event;"
|
"call _kos_wait_event;"
|
||||||
"pop ebp edi esi ebx"
|
"pop ebp;"
|
||||||
|
"pop edi;"
|
||||||
|
"pop esi;"
|
||||||
|
"pop ebx"
|
||||||
:
|
:
|
||||||
: "a"(event),
|
: "a"(event),
|
||||||
"b"(uid)
|
"b"(uid)
|
||||||
@ -646,13 +668,19 @@ kos_wait_event(void *event, uint32_t uid) {
|
|||||||
|
|
||||||
typedef uint32_t (*wait_test_t)(void *);
|
typedef uint32_t (*wait_test_t)(void *);
|
||||||
|
|
||||||
static inline void*
|
static inline void *
|
||||||
kos_wait_events(wait_test_t wait_test, void *wait_param) {
|
kos_wait_events(wait_test_t wait_test, void *wait_param) {
|
||||||
void *res;
|
void *res;
|
||||||
__asm__ __inline__ __volatile__ (
|
__asm__ __inline__ __volatile__ (
|
||||||
"push ebx esi edi ebp;"
|
"push %%ebx;"
|
||||||
|
"push %%esi;"
|
||||||
|
"push %%edi;"
|
||||||
|
"push %%ebp;"
|
||||||
"call _kos_wait_events;"
|
"call _kos_wait_events;"
|
||||||
"pop ebp edi esi ebx"
|
"pop %%ebp;"
|
||||||
|
"pop %%edi;"
|
||||||
|
"pop %%esi;"
|
||||||
|
"pop %%ebx"
|
||||||
: "=a"(res)
|
: "=a"(res)
|
||||||
: "c"(wait_param),
|
: "c"(wait_param),
|
||||||
"d"(wait_test)
|
"d"(wait_test)
|
||||||
|
39
umka_os.c
39
umka_os.c
@ -42,6 +42,13 @@ struct umka_os_ctx {
|
|||||||
|
|
||||||
char history_filename[PATH_MAX];
|
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 *
|
struct umka_os_ctx *
|
||||||
umka_os_init() {
|
umka_os_init() {
|
||||||
struct umka_os_ctx *ctx = malloc(sizeof(struct umka_os_ctx));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
/*
|
||||||
|
static int
|
||||||
load_app(const char *fname) {
|
load_app(const char *fname) {
|
||||||
int32_t result = umka_fs_execute(fname);
|
int32_t result = umka_fs_execute(fname);
|
||||||
printf("result: %" PRIi32 "\n", result);
|
printf("result: %" PRIi32 "\n", result);
|
||||||
|
|
||||||
return 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)signo;
|
||||||
(void)info;
|
(void)info;
|
||||||
ucontext_t *ctx = context;
|
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));
|
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)signo;
|
||||||
(void)info;
|
(void)info;
|
||||||
(void)context;
|
(void)context;
|
||||||
kos_irq_serv_irq10();
|
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
|
int
|
||||||
main(int argc, char *argv[]) {
|
main(int argc, char *argv[]) {
|
||||||
(void)argc;
|
(void)argc;
|
||||||
@ -214,6 +236,15 @@ main(int argc, char *argv[]) {
|
|||||||
return 1;
|
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
|
struct app_hdr *app = mmap(KOS_APP_BASE, 16*0x100000, PROT_READ | PROT_WRITE
|
||||||
| PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
| PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
if (app == MAP_FAILED) {
|
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);
|
// thread_start(0, monitor, THREAD_STACK_SIZE);
|
||||||
kos_thread_t start = (kos_thread_t)(KOS_APP_BASE + app->menuet.start);
|
kos_thread_t start = (kos_thread_t)(KOS_APP_BASE + app->menuet.start);
|
||||||
thread_start(0, start, THREAD_STACK_SIZE);
|
thread_start(0, start, THREAD_STACK_SIZE);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
umka_init umka_os
|
umka_init os
|
||||||
ramdisk_init ../img/kolibri.raw
|
ramdisk_init ../img/kolibri.raw
|
||||||
|
set_skin /sys/DEFAULT.SKN
|
||||||
disk_add ../img/xfs_samehash_s05k.raw hd0 -c 0
|
disk_add ../img/xfs_samehash_s05k.raw hd0 -c 0
|
||||||
|
Loading…
Reference in New Issue
Block a user