umka_os: Load very basic userspace KolibriOS app
This commit is contained in:
parent
ce6ad3efa6
commit
d479f8a121
1
.gitignore
vendored
1
.gitignore
vendored
@ -38,3 +38,4 @@ t.d
|
|||||||
*.exe
|
*.exe
|
||||||
colors.dtp
|
colors.dtp
|
||||||
.tup
|
.tup
|
||||||
|
hello_board
|
||||||
|
23
apps/hello_board.asm
Normal file
23
apps/hello_board.asm
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
use32
|
||||||
|
org 0
|
||||||
|
db 'MENUET01'
|
||||||
|
dd 1, start, i_end, e_end, e_end, 0, 0
|
||||||
|
|
||||||
|
__DEBUG__ = 1
|
||||||
|
__DEBUG_LEVEL__ = 1
|
||||||
|
|
||||||
|
include 'proc32.inc'
|
||||||
|
include 'macros.inc'
|
||||||
|
include 'debug-fdo.inc'
|
||||||
|
|
||||||
|
start:
|
||||||
|
DEBUGF 1, "Hello board\n"
|
||||||
|
exit:
|
||||||
|
mcall 18, 9, 2
|
||||||
|
mcall -1
|
||||||
|
mcall -2 ; just to check it's unreachable
|
||||||
|
|
||||||
|
include_debug_strings
|
||||||
|
i_end:
|
||||||
|
rb 0x100 ;stack
|
||||||
|
e_end:
|
23
apps/makefile
Normal file
23
apps/makefile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
FASM_EXE ?= fasm
|
||||||
|
FASM_FLAGS=-dUMKA=1
|
||||||
|
|
||||||
|
ifeq ($(HOST),linux)
|
||||||
|
FASM_INCLUDE=$(KOLIBRIOS)/programs
|
||||||
|
FASM=INCLUDE="$(FASM_INCLUDE)" $(FASM_EXE) $(FASM_FLAGS)
|
||||||
|
else ifeq ($(HOST),windows)
|
||||||
|
FASM_INCLUDE=$(KOLIBRIOS)\programs
|
||||||
|
FASM=set "INCLUDE=$(FASM_INCLUDE)" && $(FASM_EXE) $(FASM_FLAGS)
|
||||||
|
else
|
||||||
|
$(error your OS is not supported)
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: hello_board
|
||||||
|
|
||||||
|
%: %.asm
|
||||||
|
$(FASM) $< $@
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f hello_board
|
@ -2,6 +2,7 @@
|
|||||||
#define __USE_GNU
|
#define __USE_GNU
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
|
|
||||||
@ -12,6 +13,10 @@ void reset_procmask(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get_fake_if(ucontext_t *ctx) {
|
int get_fake_if(ucontext_t *ctx) {
|
||||||
// we fake IF with id flag
|
// we fake IF with ID flag
|
||||||
return !(ctx->uc_mcontext.__gregs[REG_EFL] & (1 << 21));
|
return !(ctx->uc_mcontext.__gregs[REG_EFL] & (1 << 21));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void system_shutdown() {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
8
makefile
8
makefile
@ -7,7 +7,6 @@ ifndef HOST
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
FASM_EXE ?= fasm
|
FASM_EXE ?= fasm
|
||||||
FASM_INCLUDE=$(KOLIBRIOS)/kernel/trunk;$(KOLIBRIOS)/programs/develop/libraries/libcrash/hash
|
|
||||||
FASM_FLAGS=-dUEFI=1 -dextended_primary_loader=1 -dUMKA=1 -dHOST=$(HOST) -m 2000000
|
FASM_FLAGS=-dUEFI=1 -dextended_primary_loader=1 -dUMKA=1 -dHOST=$(HOST) -m 2000000
|
||||||
|
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
@ -78,7 +77,7 @@ umka_gen_devices_dat: umka_gen_devices_dat.o umka.o pci.o thread.o util.o
|
|||||||
umka.o umka.fas: umka.asm
|
umka.o umka.fas: umka.asm
|
||||||
$(FASM) $< umka.o -s umka.fas
|
$(FASM) $< umka.o -s umka.fas
|
||||||
|
|
||||||
shell.o: shell.c
|
shell.o: shell.c lodepng.h
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
thread.o: $(HOST)/thread.c
|
thread.o: $(HOST)/thread.c
|
||||||
@ -90,6 +89,9 @@ pci.o: $(HOST)/pci.c
|
|||||||
lodepng.o: lodepng.c lodepng.h
|
lodepng.o: lodepng.c lodepng.h
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
|
#bestline.o: bestline.c bestline.h
|
||||||
|
# $(CC) $(CFLAGS_32) -U_POSIX_C_SOURCE -Wno-logical-op -Wno-switch-enum -c $<
|
||||||
|
|
||||||
getopt.o: getopt.c getopt.h
|
getopt.o: getopt.c getopt.h
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
@ -136,7 +138,7 @@ umka_fuse.o: umka_fuse.c umka.h
|
|||||||
$(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $<
|
$(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $<
|
||||||
|
|
||||||
umka_os.o: umka_os.c umka.h
|
umka_os.o: umka_os.c umka.h
|
||||||
$(CC) $(CFLAGS_32) -c $< -D_XOPEN_SOURCE=600
|
$(CC) $(CFLAGS_32) -c $<
|
||||||
|
|
||||||
umka_gen_devices_dat.o: umka_gen_devices_dat.c umka.h
|
umka_gen_devices_dat.o: umka_gen_devices_dat.c umka.h
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
$(CC) $(CFLAGS_32) -c $<
|
||||||
|
6
shell.c
6
shell.c
@ -223,13 +223,9 @@ next_line(int is_tty, int block) {
|
|||||||
FD_SET(fileno(fin), &readfds);
|
FD_SET(fileno(fin), &readfds);
|
||||||
struct timeval timeout = {.tv_sec = 0, .tv_usec = 0};
|
struct timeval timeout = {.tv_sec = 0, .tv_usec = 0};
|
||||||
int sr = select(fileno(fin)+1, &readfds, NULL, NULL, &timeout);
|
int sr = select(fileno(fin)+1, &readfds, NULL, NULL, &timeout);
|
||||||
|
cmd_buf[0] = '\0';
|
||||||
if (sr > 0) {
|
if (sr > 0) {
|
||||||
fgets(cmd_buf, FGETS_BUF_LEN, fin);
|
fgets(cmd_buf, FGETS_BUF_LEN, fin);
|
||||||
if (cmd_buf[0] == EOF) {
|
|
||||||
cmd_buf[0] = '\0';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cmd_buf[0] = '\0';
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
18
umka.asm
18
umka.asm
@ -164,15 +164,17 @@ pubsym _display, 'kos_display'
|
|||||||
|
|
||||||
pubsym BOOT, 'kos_boot'
|
pubsym BOOT, 'kos_boot'
|
||||||
|
|
||||||
|
EFLAGS.ID = 1 SHL 21
|
||||||
|
|
||||||
macro cli {
|
macro cli {
|
||||||
pushfd
|
pushfd
|
||||||
bts dword[esp], 21
|
bts dword[esp], BSF EFLAGS.ID
|
||||||
popfd
|
popfd
|
||||||
}
|
}
|
||||||
|
|
||||||
macro sti {
|
macro sti {
|
||||||
pushfd
|
pushfd
|
||||||
btr dword[esp], 21
|
btr dword[esp], BSF EFLAGS.ID
|
||||||
popfd
|
popfd
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,6 +190,9 @@ macro int n {
|
|||||||
end if
|
end if
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section '.app' executable writable align 64
|
||||||
|
rb 64*1024
|
||||||
|
|
||||||
section '.text' executable align 64
|
section '.text' executable align 64
|
||||||
|
|
||||||
coverage_begin:
|
coverage_begin:
|
||||||
@ -286,7 +291,7 @@ include 'core/taskman.inc'
|
|||||||
include 'core/dll.inc'
|
include 'core/dll.inc'
|
||||||
macro call target {
|
macro call target {
|
||||||
if target eq pci_read_reg
|
if target eq pci_read_reg
|
||||||
call _pci_read_reg
|
call _pci_read_reg
|
||||||
else
|
else
|
||||||
call target
|
call target
|
||||||
end if
|
end if
|
||||||
@ -603,7 +608,7 @@ proc umka_init c uses ebx esi edi ebp
|
|||||||
sub [edx+APPDATA.saved_esp], 4
|
sub [edx+APPDATA.saved_esp], 4
|
||||||
mov eax, [edx+APPDATA.saved_esp]
|
mov eax, [edx+APPDATA.saved_esp]
|
||||||
mov dword[eax], 0
|
mov dword[eax], 0
|
||||||
xor ecx, ecx
|
movi ecx, MAX_PRIORITY
|
||||||
call scheduler_add_thread
|
call scheduler_add_thread
|
||||||
|
|
||||||
mov [current_slot_idx], 2
|
mov [current_slot_idx], 2
|
||||||
@ -720,7 +725,7 @@ proc irq0 c, _signo, _info, _context
|
|||||||
|
|
||||||
inc [timer_ticks]
|
inc [timer_ticks]
|
||||||
call updatecputimes
|
call updatecputimes
|
||||||
ccall reset_procmask
|
ccall reset_procmask ; kind of irq_eoi:ta
|
||||||
ccall get_fake_if, [_context]
|
ccall get_fake_if, [_context]
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jnz @f
|
jnz @f
|
||||||
@ -760,6 +765,8 @@ proc map_io_mem _base, _size, _flags
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
extrn system_shutdown
|
||||||
|
|
||||||
sysfn_saveramdisk:
|
sysfn_saveramdisk:
|
||||||
sysfn_meminfo:
|
sysfn_meminfo:
|
||||||
check_fdd_motor_status:
|
check_fdd_motor_status:
|
||||||
@ -767,7 +774,6 @@ check_ATAPI_device_event:
|
|||||||
check_fdd_motor_status_has_work?:
|
check_fdd_motor_status_has_work?:
|
||||||
check_ATAPI_device_event_has_work?:
|
check_ATAPI_device_event_has_work?:
|
||||||
request_terminate:
|
request_terminate:
|
||||||
system_shutdown:
|
|
||||||
terminate:
|
terminate:
|
||||||
LoadMedium:
|
LoadMedium:
|
||||||
clear_CD_cache:
|
clear_CD_cache:
|
||||||
|
23
umka.ld
23
umka.ld
@ -1,7 +1,23 @@
|
|||||||
|
/*
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
pew : ORIGIN = 0, LENGTH = 64K
|
||||||
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = ALIGN(65536);
|
.aou 0:
|
||||||
.data.aligned :
|
{
|
||||||
|
*(.app)
|
||||||
|
} : NONE
|
||||||
|
|
||||||
|
}
|
||||||
|
INSERT BEFORE .interp;
|
||||||
|
*/
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.data.aligned BLOCK(65536) :
|
||||||
{
|
{
|
||||||
*(SORT_BY_NAME(.data.align*))
|
*(SORT_BY_NAME(.data.align*))
|
||||||
}
|
}
|
||||||
@ -11,8 +27,7 @@ INSERT AFTER .data;
|
|||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = ALIGN(65536);
|
.bss.aligned BLOCK(65536) :
|
||||||
.bss.aligned :
|
|
||||||
{
|
{
|
||||||
*(SORT_BY_NAME(.bss.align*))
|
*(SORT_BY_NAME(.bss.align*))
|
||||||
}
|
}
|
||||||
|
58
umka_os.c
58
umka_os.c
@ -19,10 +19,12 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#define __USE_GNU
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#define __USE_MISC
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -97,6 +99,43 @@ void new_monitor(void) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct app_menuet {
|
||||||
|
char signature[8]; // MENUETXX
|
||||||
|
uint32_t version; // 1
|
||||||
|
void (*start) (void); // start
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
load_app(const char *fname, void *base) {
|
||||||
|
FILE *f = fopen(fname, "r");
|
||||||
|
if (!f) {
|
||||||
|
perror("Can't open app file");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fread(base, 1, 0x4000, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 0x64; i++) {
|
||||||
|
fprintf(stderr, "%2.2hx ", ((uint8_t*)base)[i]);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_i40(int signo, siginfo_t *info, void *context) {
|
||||||
|
(void)signo;
|
||||||
|
(void)info;
|
||||||
|
ucontext_t *ctx = context;
|
||||||
|
void *ip = (void*)ctx->uc_mcontext.__gregs[REG_EIP];
|
||||||
|
int eax = ctx->uc_mcontext.__gregs[REG_EAX];
|
||||||
|
if (*(uint16_t*)ip == 0x40cd) {
|
||||||
|
ctx->uc_mcontext.__gregs[REG_EIP] += 2; // skip int 0x40
|
||||||
|
}
|
||||||
|
printf("i40: %i %p\n", eax, ip);
|
||||||
|
umka_i40((pushad_t*)(ctx->uc_mcontext.__gregs + REG_EDI));
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main() {
|
main() {
|
||||||
if (coverage)
|
if (coverage)
|
||||||
@ -111,19 +150,29 @@ main() {
|
|||||||
sa.sa_flags = SA_SIGINFO;
|
sa.sa_flags = SA_SIGINFO;
|
||||||
|
|
||||||
if (sigaction(SIGPROF, &sa, NULL) == -1) {
|
if (sigaction(SIGPROF, &sa, NULL) == -1) {
|
||||||
printf("Can't install signal handler!\n");
|
printf("Can't install SIGPROF handler!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
sa.sa_sigaction = handle_i40;
|
||||||
void *app_base = mmap((void*)0x000000, 16*0x100000, PROT_READ | PROT_WRITE |
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_flags = SA_SIGINFO;
|
||||||
|
|
||||||
|
if (sigaction(SIGSEGV, &sa, NULL) == -1) {
|
||||||
|
printf("Can't install SIGSEGV handler!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *app_base = mmap((void*)0, 16*0x100000, PROT_READ | PROT_WRITE |
|
||||||
PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
|
PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
if (app_base == MAP_FAILED) {
|
if (app_base == MAP_FAILED) {
|
||||||
perror("mmap failed");
|
perror("mmap failed");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
load_app("../apps/hello_board", app_base);
|
||||||
|
|
||||||
printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base);
|
printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base);
|
||||||
|
|
||||||
kos_boot.bpp = 32;
|
kos_boot.bpp = 32;
|
||||||
@ -136,6 +185,7 @@ main() {
|
|||||||
|
|
||||||
thread_start(0, monitor, THREAD_STACK_SIZE);
|
thread_start(0, monitor, THREAD_STACK_SIZE);
|
||||||
thread_start(0, umka_thread_net_drv, THREAD_STACK_SIZE);
|
thread_start(0, umka_thread_net_drv, THREAD_STACK_SIZE);
|
||||||
|
thread_start(0, ((struct app_menuet*)app_base)->start, THREAD_STACK_SIZE);
|
||||||
// thread_start(0, umka_thread_ping, THREAD_STACK_SIZE);
|
// thread_start(0, umka_thread_ping, THREAD_STACK_SIZE);
|
||||||
|
|
||||||
setitimer(ITIMER_PROF, &timeout, NULL);
|
setitimer(ITIMER_PROF, &timeout, NULL);
|
||||||
|
@ -84,6 +84,7 @@ int go_ping = 0;
|
|||||||
void
|
void
|
||||||
umka_thread_ping(void) {
|
umka_thread_ping(void) {
|
||||||
umka_sti();
|
umka_sti();
|
||||||
|
fprintf(stderr, "[ping] starting\n");
|
||||||
while (!go_ping) { /* wait until initialized */ }
|
while (!go_ping) { /* wait until initialized */ }
|
||||||
|
|
||||||
f75ret_t r75;
|
f75ret_t r75;
|
||||||
|
Loading…
Reference in New Issue
Block a user