Run net stack, jump to the osloop. Compiles, doesn't crash.

This commit is contained in:
Ivan Baravy 2020-05-09 05:15:57 +03:00
parent dad581883c
commit 0d07b5810f
6 changed files with 250 additions and 98 deletions

View File

@ -8,26 +8,20 @@ sigjmp_buf trampoline;
__attribute__((__stdcall__)) __attribute__((__stdcall__))
uint32_t umka_new_sys_threads(void (*func)(void), void *stack, int type) { uint32_t umka_sched_add_thread(appdata_t *app) {
(void)type;
(void)func;
fprintf(stderr, "umka_new_sys_threads before\n"); fprintf(stderr, "umka_new_sys_threads before\n");
// kos_slot_base[kos_task_count].fpu_state = malloc(4096);
fprintf(stderr, "kos_task_count: %d\n", kos_task_count); fprintf(stderr, "kos_task_count: %d\n", kos_task_count);
if (!sigsetjmp(trampoline, 1)) { if (!sigsetjmp(trampoline, 1)) {
__asm__ __inline__ __volatile__ ( __asm__ __inline__ __volatile__ (
"mov esp, eax;" "mov esp, eax"
"push ecx"
: :
: "a"(stack), : "a"(app->saved_esp)
"c"(func)
: "memory"); : "memory");
if (!sigsetjmp(*kos_slot_base[kos_task_count++].fpu_state, 1)) { if (!sigsetjmp(*app->fpu_state, 1)) {
longjmp(trampoline, 1); longjmp(trampoline, 1);
} else { } else {
__asm__ __inline__ __volatile__ ( __asm__ __inline__ __volatile__ (
"pop ecx;" "ret"
"call ecx"
: :
: :
: "memory"); : "memory");

View File

@ -1,7 +1,7 @@
FASM=fasm FASM=fasm
CC=gcc CC=gcc
WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 -Wswitch -Wswitch-enum #-Wconversion -Wsign-conversion WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 -Wswitch -Wswitch-enum #-Wconversion -Wsign-conversion
CFLAGS=$(WARNINGS) -std=c99 -g -O0 -D_FILE_OFFSET_BITS=64 -Wno-address-of-packed-member -DNDEBUG -masm=intel -D_POSIX_C_SOURCE=200809L CFLAGS=$(WARNINGS) -std=c99 -g -O0 -D_FILE_OFFSET_BITS=64 -Wno-address-of-packed-member -DNDEBUG -masm=intel -D_POSIX_C_SOURCE=200809L -Ilinux
CFLAGS_32=$(CFLAGS) -m32 CFLAGS_32=$(CFLAGS) -m32
LDFLAGS= LDFLAGS=
LDFLAGS_32=$(LDFLAGS) -m32 LDFLAGS_32=$(LDFLAGS) -m32
@ -11,19 +11,22 @@ all: umka_shell umka_fuse umka_os umka.sym umka.prp umka.lst tags tools/mkdirran
covpreproc: covpreproc.c covpreproc: covpreproc.c
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
umka_shell: umka_shell.o umka.o trace.o trace_lbr.o vdisk.o vnet.o lodepng.o pci.o umka_shell: umka_shell.o umka.o trace.o trace_lbr.o vdisk.o vnet.o lodepng.o pci.o thread.o
$(CC) $(LDFLAGS_32) $^ -o $@ -static $(CC) $(LDFLAGS_32) $^ -o $@ -static
umka_fuse: umka_fuse.o umka.o trace.o trace_lbr.o vdisk.o pci.o umka_fuse: umka_fuse.o umka.o trace.o trace_lbr.o vdisk.o pci.o thread.o
$(CC) $(LDFLAGS_32) $^ -o $@ `pkg-config fuse3 --libs` $(CC) $(LDFLAGS_32) $^ -o $@ `pkg-config fuse3 --libs`
umka_os: umka_os.o umka.o trace.o trace_lbr.o vdisk.o pci.o umka_os: umka_os.o umka.o trace.o trace_lbr.o vdisk.o pci.o thread.o
$(CC) $(LDFLAGS_32) $^ -o $@ $(CC) $(LDFLAGS_32) $^ -o $@ -static
umka.o umka.fas: umka.asm umka.o umka.fas: umka.asm
INCLUDE="$(KOLIBRI)/kernel/trunk;$(KOLIBRI)/programs/develop/libraries/libcrash/trunk" $(FASM) $< umka.o -s umka.fas -m 1234567 INCLUDE="$(KOLIBRI)/kernel/trunk;$(KOLIBRI)/programs/develop/libraries/libcrash/trunk" $(FASM) $< umka.o -s umka.fas -m 1234567
pci.o: pci.c thread.o: linux/thread.c
$(CC) $(CFLAGS_32) -c $<
pci.o: linux/pci.c
$(CC) $(CFLAGS_32) -c $< $(CC) $(CFLAGS_32) -c $<
lodepng.o: lodepng.c lodepng.h lodepng.o: lodepng.c lodepng.h

View File

@ -18,3 +18,5 @@ STDOUT = 1
STDERR = 2 STDERR = 2
ENOENT = 2 ENOENT = 2
SIGPROF = 27

140
umka.asm
View File

@ -22,6 +22,13 @@ public sha3_256_oneshot as 'hash_oneshot'
public kos_time_to_epoch public kos_time_to_epoch
public kos_init public kos_init
public CURRENT_TASK as 'kos_current_task'
public current_slot as 'kos_current_slot'
public TASK_COUNT as 'kos_task_count'
public task_base_addr as 'kos_task_base'
public task_data_addr as 'kos_task_data'
public slot_base_addr as 'kos_slot_base'
public win_stack_addr as 'kos_win_stack' public win_stack_addr as 'kos_win_stack'
public win_pos_addr as 'kos_win_pos' public win_pos_addr as 'kos_win_pos'
public lfb_base_addr as 'kos_lfb_base' public lfb_base_addr as 'kos_lfb_base'
@ -118,9 +125,9 @@ include 'core/string.inc'
include 'core/malloc.inc' include 'core/malloc.inc'
include 'core/heap.inc' include 'core/heap.inc'
include 'core/dll.inc' include 'core/dll.inc'
new_sys_threads equ __pew_pew ;new_sys_threads equ __pew_pew
include 'core/taskman.inc' include 'core/taskman.inc'
restore new_sys_threads ;restore new_sys_threads
include 'core/timers.inc' include 'core/timers.inc'
include 'core/clipboard.inc' include 'core/clipboard.inc'
include 'core/syscall.inc' include 'core/syscall.inc'
@ -174,6 +181,11 @@ proc kos_init c uses ebx esi edi ebp
call init_kernel_heap call init_kernel_heap
call init_malloc call init_malloc
mov eax, sys_proc
list_init eax
add eax, PROC.thr_list
list_init eax
mov [BOOT.bpp], 32 mov [BOOT.bpp], 32
mov [BOOT.x_res], 400 mov [BOOT.x_res], 400
mov [BOOT.y_res], 300 mov [BOOT.y_res], 300
@ -258,6 +270,109 @@ proc kos_init c uses ebx esi edi ebp
ret ret
endp endp
public idle as 'umka_idle'
proc idle uses ebx esi edi
.loop:
mov ecx, 10000000
@@:
loop @b
DEBUGF 1, "1 idle\n"
jmp .loop
ret
endp
extrn raise
public umka_os
proc umka_os uses ebx esi edi
call kos_init
; mov [fdd_motor_status], 0
mov eax, -1
mov edi, thr_slot_map+4
mov [edi-4], dword 0xFFFFFFF8
stosd
stosd
stosd
stosd
stosd
stosd
stosd
mov [current_process], sys_proc
mov dword[CURRENT_TASK], 0
mov dword[TASK_COUNT], 0
stdcall kernel_alloc, RING0_STACK_SIZE
mov ebx, eax
mov edx, SLOT_BASE+256*1
call setup_os_slot
mov dword [edx], 'IDLE'
sub [edx+APPDATA.saved_esp], 4
mov eax, [edx+APPDATA.saved_esp]
mov dword[eax], idle ; _thread
mov ecx, IDLE_PRIORITY
call sched_add_thread
stdcall kernel_alloc, RING0_STACK_SIZE
mov ebx, eax
mov edx, SLOT_BASE+256*2
call setup_os_slot
mov dword [edx], 'OS'
sub [edx+APPDATA.saved_esp], 4
mov eax, [edx+APPDATA.saved_esp]
mov dword[eax], 0
xor ecx, ecx
call sched_add_thread
mov dword[CURRENT_TASK], 2
mov dword[TASK_COUNT], 3
mov [current_slot], SLOT_BASE+256*2
; movi ebx, 1
; mov ecx, eth_process_input
; call new_sys_threads
call stack_init
mov edx, SLOT_BASE+256*3
xor ecx, ecx
call sched_add_thread
mov edx, SLOT_BASE+256*4
xor ecx, ecx
call sched_add_thread
mov edx, SLOT_BASE+256*5
xor ecx, ecx
call sched_add_thread
mov dword[TASK_COUNT], 6
ccall raise, SIGPROF
jmp osloop
.loop:
mov ecx, 10000000
@@:
loop @b
DEBUGF 1, "2 os\n"
jmp .loop
ret
endp
; in: edx -> APPDATA for OS/IDLE slot
; in: ebx = stack base
proc s2etup_os_slot
ret
endp
extrn pci_read extrn pci_read
proc pci_read_reg uses ebx esi edi proc pci_read_reg uses ebx esi edi
mov ecx, eax mov ecx, eax
@ -300,8 +415,9 @@ proc map_io_mem _base, _size, _flags
ret ret
endp endp
new_sys_threads: extrn umka_sched_add_thread
xor eax, eax sched_add_thread:
stdcall umka_sched_add_thread, edx
ret ret
change_task: change_task:
@ -383,6 +499,7 @@ map_memEx:
HEAP_BASE equ HEAP_BASE equ
include 'init.inc' include 'init.inc'
sys_msg_board equ __pew sys_msg_board equ __pew
;setup_os_slot equ ___pew
include fix pew include fix pew
macro pew x {} macro pew x {}
@ -402,12 +519,20 @@ macro lea r, v {
macro add r, v { macro add r, v {
if v eq CURRENT_TASK - (SLOT_BASE shr 3) if v eq CURRENT_TASK - (SLOT_BASE shr 3)
int3 ; int3
push r
mov r, SLOT_BASE
shr r, 3
neg r
add r, CURRENT_TASK
add r, [esp]
add esp, 4
else else
add r, v add r, v
end if end if
} }
include 'kernel.asm' include 'kernel.asm'
purge lea,add,org purge lea,add,org
@ -421,6 +546,11 @@ section '.data' writeable align 64
timer_ticks dd 0 timer_ticks dd 0
fpu_owner dd ? fpu_owner dd ?
task_base_addr dd TASK_BASE
task_data_addr dd TASK_DATA
slot_base_addr dd SLOT_BASE
win_stack_addr dd WIN_STACK win_stack_addr dd WIN_STACK
win_pos_addr dd WIN_POS win_pos_addr dd WIN_POS
lfb_base_addr dd lfb_base lfb_base_addr dd lfb_base

88
umka.h
View File

@ -2,6 +2,7 @@
#define UMKA_H_INCLUDED #define UMKA_H_INCLUDED
#include <inttypes.h> #include <inttypes.h>
#include <setjmp.h>
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
@ -315,7 +316,8 @@ typedef struct {
uint16_t ttl; uint16_t ttl;
} arp_entry_t; } arp_entry_t;
void umka_os(void);
//void umka_idle(void);
void kos_init(void); void kos_init(void);
void i40(void); void i40(void);
uint32_t kos_time_to_epoch(uint32_t *time); uint32_t kos_time_to_epoch(uint32_t *time);
@ -375,6 +377,90 @@ static inline int32_t kos_net_add_device(net_device_t *dev) {
void coverage_begin(void); void coverage_begin(void);
void coverage_end(void); void coverage_end(void);
typedef struct appobj_t appobj_t;
struct appobj_t {
uint32_t magic;
void *destroy; // internal destructor
appobj_t *fd; // next object in list
appobj_t *bk; // prev object in list
uint32_t pid; // owner id
};
typedef struct {
uint32_t magic;
void *destroy; // internal destructor
appobj_t *fd; // next object in list
appobj_t *bk; // prev object in list
uint32_t pid; // owner id
uint32_t id; // event uid
uint32_t state; // internal flags
uint32_t code;
uint32_t pad[5];
} event_t;
typedef struct {
char app_name[11];
uint8_t pad1[5];
lhead_t list; // +16
uint32_t process; // +24
sigjmp_buf *fpu_state; // +28
void *exc_handler; // +32
uint32_t except_mask; // +36
void *pl0_stack; // +40
void *cursor; // +44
event_t *fd_ev; // +48
event_t *bk_ev; // +52
appobj_t *fd_obj; // +56
appobj_t *bk_obj; // +60
uint32_t saved_esp; // +64
uint32_t io_map[2]; // +68
uint32_t dbg_state; // +76
/*
cur_dir dd ? ;+80
wait_timeout dd ? ;+84
saved_esp0 dd ? ;+88
wait_begin dd ? ;+92 +++
wait_test dd ? ;+96 +++
wait_param dd ? ;+100 +++
tls_base dd ? ;+104
dd ? ;+108
event_filter dd ? ;+112
draw_bgr_x dd ? ;+116
draw_bgr_y dd ? ;+120
dd ? ;+124
wnd_shape dd ? ;+128
wnd_shape_scale dd ? ;+132
dd ? ;+136
dd ? ;+140
saved_box BOX ;+144
ipc_start dd ? ;+160
ipc_size dd ? ;+164
event_mask dd ? ;+168
debugger_slot dd ? ;+172
terminate_protection dd ? ;+176
keyboard_mode db ? ;+180
captionEncoding db ?
rb 2
exec_params dd ? ;+184
dbg_event_mem dd ? ;+188
dbg_regs DBG_REGS ;+192
wnd_caption dd ? ;+212
wnd_clientbox BOX ;+216
priority dd ? ;+232
in_schedule LHEAD ;+236
*/
uint8_t pad[256-80];
} appdata_t;
extern uint32_t kos_current_task;
extern appdata_t *kos_current_slot;
extern size_t kos_task_count;
extern void *kos_task_base;
extern void *kos_task_data;
extern appdata_t *kos_slot_base;
extern uint32_t *kos_lfb_base; extern uint32_t *kos_lfb_base;
extern uint16_t *kos_win_stack; extern uint16_t *kos_win_stack;
extern uint16_t *kos_win_pos; extern uint16_t *kos_win_pos;

View File

@ -3,87 +3,28 @@
#include <stdio.h> #include <stdio.h>
#include <sys/time.h> #include <sys/time.h>
#include "umka.h" #include "umka.h"
#include "thread.h"
#define THREAD_STACK_SIZE 0x2000 struct itimerval timeout = {.it_value = {.tv_sec = 0, .tv_usec = 10000}};
#define MAX_THREADS 16
struct itimerval timeout = {.it_value = {.tv_sec = 0, .tv_usec = 999}};
sigjmp_buf threads[MAX_THREADS], trampoline;
size_t cur_thread = 0;
size_t thread_cnt = 1;
uint8_t stack_os[THREAD_STACK_SIZE];
uint8_t stack_thrda[THREAD_STACK_SIZE];
uint8_t stack_thrdb[THREAD_STACK_SIZE];
static void add_new_thread(void (*func)(void), void *stack) {
if (!sigsetjmp(trampoline, 1)) {
__asm__ __inline__ __volatile__ (
"mov esp, eax;"
"push ecx"
:
: "a"(stack),
"c"(func)
: "memory");
if (!sigsetjmp(threads[thread_cnt++], 1)) {
longjmp(trampoline, 1);
} else {
__asm__ __inline__ __volatile__ (
"pop ecx;"
"call ecx"
:
:
: "memory");
}
}
}
void scheduler(int signo, siginfo_t *info, void *context) { void scheduler(int signo, siginfo_t *info, void *context) {
(void)signo; (void)signo;
(void)info; (void)info;
(void)context; (void)context;
printf("##### cur_thread: %u\n", cur_thread); // printf("##### switching from task %u\n", kos_current_task);
if (!sigsetjmp(threads[cur_thread], 1)) { if (!sigsetjmp(*kos_slot_base[kos_current_task].fpu_state, 1)) {
printf("##### saved\n"); // printf("##### saved\n");
cur_thread += 1; kos_current_task += 1;
if (cur_thread == thread_cnt) { if (kos_current_task == kos_task_count) {
cur_thread = 0; kos_current_task = 1;
} }
kos_current_slot = kos_slot_base + kos_current_task;
printf("##### kos_current_task: %u\n", kos_current_task);
setitimer(ITIMER_PROF, &timeout, NULL); setitimer(ITIMER_PROF, &timeout, NULL);
siglongjmp(threads[cur_thread], 1); siglongjmp(*kos_slot_base[kos_current_task].fpu_state, 1);
} }
} }
void os() {
printf("0 osidle begin\n");
raise(SIGPROF);
while (1) { // osloop
for (int i = 0; i < 10000000; i++) ;
printf("0 osloop\n");
fflush(stdout);
}
printf("0 osidle end\n");
}
void thrda() {
printf("1 thrd a begin\n");
while (1) {
for (int i = 0; i < 10000000; i++) ;
printf("1 thrd a\n");
fflush(stdout);
}
printf("1 thrd a end\n");
}
void thrdb() {
printf("2 thrd b begin\n");
while (1) {
for (int i = 0; i < 10000000; i++) ;
printf("2 thrd b\n");
fflush(stdout);
}
printf("2 thrd b end\n");
}
int main() { int main() {
struct sigaction sa; struct sigaction sa;
@ -96,11 +37,7 @@ int main() {
return 1; return 1;
} }
// add_new_thread(os, stack_os[0x1000]); umka_os();
add_new_thread(thrda, stack_thrda+THREAD_STACK_SIZE);
add_new_thread(thrdb, stack_thrdb+THREAD_STACK_SIZE);
os();
return 0; return 0;
} }