Run net stack, jump to the osloop. Compiles, doesn't crash.
This commit is contained in:
parent
dad581883c
commit
0d07b5810f
@ -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");
|
||||||
|
15
makefile
15
makefile
@ -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
|
||||||
|
@ -18,3 +18,5 @@ STDOUT = 1
|
|||||||
STDERR = 2
|
STDERR = 2
|
||||||
|
|
||||||
ENOENT = 2
|
ENOENT = 2
|
||||||
|
|
||||||
|
SIGPROF = 27
|
||||||
|
140
umka.asm
140
umka.asm
@ -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
88
umka.h
@ -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;
|
||||||
|
87
umka_os.c
87
umka_os.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user