umka/umka.asm

1251 lines
30 KiB
NASM
Raw Normal View History

2022-06-27 19:36:56 +02:00
; SPDX-License-Identifier: GPL-2.0-or-later
;
; UMKa - User-Mode KolibriOS developer tools
;
; Copyright (C) 2017-2023 Ivan Baravy <dunkaist@gmail.com>
2022-06-27 19:36:56 +02:00
; Copyright (C) 2021 Magomed Kostoev <mkostoevr@yandex.ru>
2020-12-09 15:15:54 +01:00
if HOST eq windows
2021-12-12 11:35:35 +01:00
format MS COFF
else if HOST eq linux
2021-12-12 11:35:35 +01:00
format ELF
else
error "Your HOST is not supported"
2021-12-12 11:35:35 +01:00
end if
; win32:
; pubsym name -> public name as "_name"
; pubsym name, 20 -> public name as "_name@20"
; pubsym name, no_mangle -> public name
; pubsym name, "name" -> public name as "_name"
; pubsym name, "name", 20 -> public name as "_name@20"
; pubsym name, "name", no_mangle -> public name as "name"
; linux:
; pubsym name -> public name
; pubsym name, 20 -> public name
; pubsym name, no_mangle -> public name
; pubsym name, "name" -> public name as "name"
; pubsym name, "name", 20 -> public name as "name"
; pubsym name, "name", no_mangle -> public name as "name"
macro pubsym name, marg1, marg2 {
if HOST eq windows
2021-12-12 11:35:35 +01:00
if marg1 eq no_mangle
public name
else if marg1 eqtype 20
public name as '_' # `name # '@' # `marg1
else if marg1 eqtype 'string'
if marg2 eq no_mangle
public name as marg1
else if marg2 eqtype 20
public name as '_' # marg1 # '@' # `marg2
else
public name as '_' # marg1
end if
else
public name as '_' # `name
end if
else if HOST eq linux
2021-12-12 11:35:35 +01:00
if marg1 eqtype 'string'
public name as marg1
else
public name
end if
else
error "Your HOST is not supported"
2021-12-12 11:35:35 +01:00
end if
}
; win32:
; extrn name -> extrn _name
; extrn name, 20 -> extrn _name@20
; linux:
; extrn name -> extrn name
; extrn name, 20 -> extrn name
macro extrn name, argsize, asname {
if HOST eq windows
2023-02-13 00:13:49 +01:00
if argsize eqtype 0 & argsize > 0
if asname eqtype 'string'
extrn '_' # `name # '@' # `argsize as asname
else
extrn '_' # `name # '@' # `argsize as name
end if
2021-12-12 11:35:35 +01:00
else
2023-02-13 00:13:49 +01:00
if asname eqtype
extrn '_' # `name as name
else
extrn '_' # `name as asname
end if
2021-12-12 11:35:35 +01:00
end if
else if HOST eq linux
2023-02-13 00:13:49 +01:00
if asname eqtype
extrn name
else
extrn name as asname
end if
else
error "Your HOST is not supported"
2021-12-12 11:35:35 +01:00
end if
}
__DEBUG__ = 1
2017-11-02 21:41:11 +01:00
__DEBUG_LEVEL__ = 1
UMKA_SHELL = 1
UMKA_FUSE = 2
UMKA_OS = 3
2020-12-29 10:45:24 +01:00
UMKA_MEMORY_BYTES = 256 SHL 20
UMKA_BOOT_DEFAULT_DISPLAY_BPP = 32
UMKA_BOOT_DEFAULT_DISPLAY_WIDTH = 400
UMKA_BOOT_DEFAULT_DISPLAY_HEIGHT = 300
pubsym idle_scheduled, 'idle_scheduled'
pubsym os_scheduled, 'os_scheduled'
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', no_mangle
2022-06-13 23:46:48 +02:00
pubsym KEY_COUNT, 'kos_key_count'
pubsym KEY_BUFF, 'kos_key_buff'
pubsym keyboard_mode, 'kos_keyboard_mode'
pubsym sys_getkey, 'kos_get_key'
pubsym syslang, 'kos_syslang'
pubsym keyboard, 'kos_keyboard'
2021-12-12 11:35:35 +01:00
pubsym disk_add, 16
pubsym disk_del, 4
pubsym disk_list
pubsym disk_media_changed, 8
pubsym xfs._.user_functions, 'xfs_user_functions'
pubsym ext_user_functions
pubsym fat_user_functions
2022-03-11 21:08:20 +01:00
pubsym exFAT_user_functions, 'exfat_user_functions'
2021-12-12 11:35:35 +01:00
pubsym ntfs_user_functions
pubsym i40, no_mangle
pubsym coverage_begin
pubsym coverage_end
pubsym sha3_256_oneshot, 'hash_oneshot'
pubsym kos_time_to_epoch
pubsym umka_init, 'umka_init'
pubsym umka_close, 'umka_close'
pubsym umka_boot
2021-12-12 11:35:35 +01:00
pubsym current_process, 'kos_current_process'
pubsym current_slot, 'kos_current_slot'
pubsym current_slot_idx, 'kos_current_slot_idx'
pubsym thread_count, 'kos_thread_count'
pubsym SLOT_BASE, 'kos_slot_base'
pubsym window_data, 'kos_window_data'
pubsym WIN_STACK, 'kos_win_stack'
pubsym WIN_POS, 'kos_win_pos'
pubsym lfb_base, 'kos_lfb_base'
pubsym RAMDISK, 'kos_ramdisk'
pubsym ramdisk_init, 'kos_ramdisk_init'
pubsym enable_acpi, no_mangle
pubsym acpi.call_name, no_mangle
pubsym acpi_ssdt_cnt, 'kos_acpi_ssdt_cnt'
pubsym acpi_ssdt_base, 'kos_acpi_ssdt_base'
pubsym acpi_ssdt_size, 'kos_acpi_ssdt_size'
pubsym acpi_ctx
pubsym acpi_usage, 'kos_acpi_usage'
pubsym acpi_node_alloc_cnt, 'kos_acpi_node_alloc_cnt'
pubsym acpi_node_free_cnt, 'kos_acpi_node_free_cnt'
pubsym acpi.count_nodes, 'kos_acpi_count_nodes', 4
2023-02-06 15:16:35 +01:00
pubsym stack_init, 'kos_stack_init', no_mangle
pubsym net_add_device, no_mangle
2021-12-12 11:35:35 +01:00
pubsym img_background
pubsym mem_BACKGROUND
pubsym sys_background
pubsym REDRAW_BACKGROUND, 'kos_redraw_background'
pubsym new_sys_threads, '_kos_new_sys_threads', no_mangle
pubsym osloop, 'kos_osloop', no_mangle
2021-12-12 11:35:35 +01:00
pubsym set_mouse_data, 'kos_set_mouse_data', 20
pubsym scheduler_current, 'kos_scheduler_current'
pubsym kos_eth_input
pubsym net_buff_alloc, 'kos_net_buff_alloc', 4
pubsym mem_block_list
pubsym pci_root, "kos_pci_root"
pubsym acpi.aml.init, "kos_acpi_aml_init"
pubsym acpi_root, "kos_acpi_root"
pubsym aml._.attach, "kos_aml_attach"
pubsym acpi.fill_pci_irqs, "kos_acpi_fill_pci_irqs"
pubsym pci.walk_tree, "kos_pci_walk_tree", 16
pubsym acpi.aml.new_thread, "kos_acpi_aml_new_thread"
pubsym aml._.alloc_node, "kos_aml_alloc_node"
pubsym aml._.constructor.integer, "kos_aml_constructor_integer"
pubsym aml._.constructor.package, "kos_aml_constructor_package"
pubsym acpi._.lookup_node, "kos_acpi_lookup_node"
pubsym acpi._.print_tree, "kos_acpi_print_tree"
pubsym acpi_dev_data, "kos_acpi_dev_data"
pubsym acpi_dev_size, "kos_acpi_dev_size"
pubsym acpi_dev_next, "kos_acpi_dev_next"
pubsym kernel_alloc, "kos_kernel_alloc"
pubsym create_event, "_kos_create_event"
pubsym destroy_event, "_kos_destroy_event"
pubsym wait_event, "_kos_wait_event"
pubsym Wait_events, "_kos_wait_events"
2021-12-12 11:35:35 +01:00
pubsym window._.set_screen, 'kos_window_set_screen'
pubsym _display, 'kos_display'
pubsym msg_board_data, "kos_msg_board_data"
pubsym msg_board_count, "kos_msg_board_count"
2021-12-12 11:35:35 +01:00
pubsym BOOT, 'kos_boot'
EFLAGS.ID = 1 SHL 21
macro lidt x {
}
2022-05-30 19:47:49 +02:00
macro invlpg addr {
}
macro cli {
pushfd
bts dword[esp], BSF EFLAGS.ID
popfd
}
macro sti {
pushfd
btr dword[esp], BSF EFLAGS.ID
popfd
}
2020-02-06 04:19:20 +01:00
iretd equ retd
iret equ ret
2020-02-04 22:53:24 +01:00
lang fix en
2020-02-08 19:27:29 +01:00
macro int n {
if n eq 0x40
call i40
else
int n
end if
}
2019-10-09 01:35:47 +02:00
section '.app' executable writable align 64
rb 64*1024
section '.text' executable align 64
2020-02-06 04:19:20 +01:00
2019-10-09 01:35:47 +02:00
coverage_begin:
include 'macros.inc'
macro diff16 msg,blah2,blah3 {
if msg eq "end of .data segment"
2023-02-13 00:13:49 +01:00
; fasm doesn't align on 1MiB, but ld script does
section '.bss.1M' writeable align 0x1000
bss_base:
end if
2020-02-04 22:53:24 +01:00
}
include 'proc32.inc'
include 'struct.inc'
macro BOOT_LO a {}
macro BOOT a {}
window_data equ __pew_window_data
background_window equ __pew_background_window
idts equ __pew07
WIN_STACK equ __pew08
WIN_POS equ __pew09
FDD_BUFF equ __pew10
WIN_TEMP_XY equ __pew11
KEY_COUNT equ __pew12
KEY_BUFF equ __pew13
BTN_COUNT equ __pew14
BTN_BUFF equ __pew15
BTN_ADDR equ __pew16
MEM_AMOUNT equ __pew17
SYS_SHUTDOWN equ __pew18
SLOT_BASE equ __pew20
sys_proc equ __pew21
VGABasePtr equ __pew22
HEAP_BASE equ __pew23
2022-05-30 19:47:49 +02:00
page_tabs equ page_tabs_pew
2020-09-18 05:00:32 +02:00
;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
restore window_data
restore background_window
restore idts,WIN_STACK,WIN_POS
restore FDD_BUFF,WIN_TEMP_XY,KEY_COUNT,KEY_BUFF,BTN_COUNT,BTN_BUFF,BTN_ADDR
restore MEM_AMOUNT,SYS_SHUTDOWN,SLOT_BASE,sys_proc,VGABasePtr
restore HEAP_BASE
2022-05-30 19:47:49 +02:00
restore page_tabs
purge BOOT_LO,BOOT
LFB_BASE = lfb_base
macro save_ring3_context {
pushad
}
macro restore_ring3_context {
popad
}
macro stdcall target, [args] {
common
if target eq is_region_userspace
cmp esp, esp ; ZF
2022-05-30 19:47:49 +02:00
else if target eq is_string_userspace
cmp esp, esp ; ZF
else
stdcall target, args
end if
}
include 'system.inc'
include 'fdo.inc'
2022-05-30 19:47:49 +02:00
OS_BASE equ 0
2023-02-13 00:13:49 +01:00
;OS_BASE equ os_base
2022-05-30 19:47:49 +02:00
macro mov target, source {
2023-02-13 00:13:49 +01:00
if source eq (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE
2022-05-30 19:47:49 +02:00
push eax eax
mov eax, HEAP_BASE
add eax, HEAP_MIN_SIZE
shr eax, 12
mov [esp+4], eax
pop eax
pop target
2023-02-13 00:13:49 +01:00
else if target eq dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)]
2022-05-30 19:47:49 +02:00
push eax ecx
mov eax, page_tabs
shr eax, 20
add eax, PROC.pdt_0
add eax, sys_proc
mov ecx, sys_proc+PROC.pdt_0+PG_SWR
mov [eax], ecx
pop ecx eax
2023-02-13 00:13:49 +01:00
else if target eq [(pci_code_32 - OS_BASE)]
else if target eq [(pci_data_32 - OS_BASE)]
else if target eq [(pci_code_32 - OS_BASE)+2]
else if target eq [(pci_data_32 - OS_BASE)+2]
else if target eq [(pci_code_32 - OS_BASE)+4]
else if target eq [(pci_data_32 - OS_BASE)+4]
else if target eq [(pci_code_32 - OS_BASE)+6]
else if target eq [(pci_data_32 - OS_BASE)+6]
else if target eq [(pci_bios_entry - OS_BASE)]
else if source eq (OS_BASE/PAGE_SIZE)
push ecx
mov ecx, OS_BASE
shr ecx, 12
mov target, ecx
pop ecx
else if target eq dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)]
else if source eq (sys_proc - OS_BASE + PROC.pdt_0) + (OS_BASE shr 20)
push ecx
mov ecx, OS_BASE
shr ecx, 20
add ecx, sys_proc
add ecx, PROC.pdt_0
sub ecx, OS_BASE
mov target, ecx
pop ecx
2022-05-30 19:47:49 +02:00
else
mov target, source
end if
}
macro cmp target, source {
2023-02-13 00:13:49 +01:00
if source eq (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE
2022-05-30 19:47:49 +02:00
push eax eax
mov eax, HEAP_BASE
add eax, HEAP_MIN_SIZE
shr eax, 12
mov [esp], eax
mov eax, [esp+4]
cmp target, [esp]
pop eax eax
2023-02-13 00:13:49 +01:00
else if source eq (OS_BASE/PAGE_SIZE)
push ecx
mov ecx, OS_BASE
shr ecx, 12
cmp target, ecx
pop ecx
2022-05-30 19:47:49 +02:00
else
cmp target, source
2022-05-30 19:47:49 +02:00
end if
}
2023-02-13 00:13:49 +01:00
macro lea target, source {
if source eq [edi + (OS_BASE shr 20)]
push ecx
mov ecx, OS_BASE
shr ecx, 20
add ecx, edi
mov target, ecx
pop ecx
else
lea target, source
end if
}
2022-05-30 19:47:49 +02:00
include 'init.inc'
purge mov
2023-02-13 00:13:49 +01:00
purge cmp
purge lea
2022-05-30 19:47:49 +02:00
restore OS_BASE
include 'core/sync.inc'
macro call target {
if target eq do_change_task
call _do_change_task
2023-01-12 22:24:06 +01:00
else if target eq page_fault_handler
call _page_fault_handler
else
call target
end if
}
2023-01-12 22:24:06 +01:00
include 'core/sys32.inc'
do_change_task equ hjk
irq0 equ irq0_pew
tss._io_map_0 equ 0
tss._io_map_1 equ 0
include 'core/sched.inc'
restore tss._io_map_0
restore tss._io_map_1
;purge mov
restore irq0
include 'core/syscall.inc'
;include 'core/fpu.inc'
2022-05-30 19:47:49 +02:00
map_io_mem equ map_io_mem_pew
create_trampoline_pgmap equ create_trampoline_pgmap_pew
alloc_page equ alloc_page_pew
alloc_pages equ alloc_pages_pew
free_page equ free_page_pew
include 'core/memory.inc'
restore map_io_mem, free_page, create_trampoline_pgmap, alloc_page, alloc_pages
;include 'core/mtrr.inc'
;user_alloc_at equ user_alloc_at_pew
include 'core/heap.inc'
;restore user_alloc_at
include 'core/malloc.inc'
2022-05-30 19:47:49 +02:00
macro mov target, source {
if target eq [edi - PAGE_SIZE + (page_tabs shr 20)]
2022-05-30 19:47:49 +02:00
push eax ebx
mov ebx, eax
mov eax, page_tabs
shr eax, 20
sub eax, PAGE_SIZE
2022-05-30 19:47:49 +02:00
add eax, edi
mov [eax], ebx
pop ebx eax
else
mov target, source
end if
}
include 'core/taskman.inc'
2022-05-30 19:47:49 +02:00
purge mov
include 'core/dll.inc'
macro call target {
if target eq pci_read_reg
call _pci_read_reg
else
call target
end if
}
include 'bus/pci/pci32.inc'
purge call
;include 'core/peload.inc'
;include 'core/exports.inc'
include 'core/string.inc'
;include 'core/v86.inc'
macro mov dst, src {
if dst eq ds
else if dst eq es
else
mov dst, src
end if
}
include 'core/irq.inc'
purge mov
purge call
include 'core/apic.inc'
include 'core/hpet.inc'
include 'core/timers.inc'
include 'core/clipboard.inc'
2020-06-05 20:24:57 +02:00
include 'core/slab.inc'
include 'posix/posix.inc'
;include 'boot/shutdown.inc'
2020-02-04 22:53:24 +01:00
include 'video/vesa20.inc'
include 'video/blitter.inc'
include 'video/vga.inc'
2020-02-04 22:53:24 +01:00
include 'video/cursors.inc'
include 'video/framebuffer.inc'
2020-02-04 22:53:24 +01:00
include 'gui/window.inc'
include 'gui/event.inc'
include 'gui/font.inc'
include 'gui/button.inc'
include 'gui/mouse.inc'
include 'gui/skincode.inc'
include 'gui/background.inc'
include 'hid/keyboard.inc'
include 'hid/mousedrv.inc'
include 'hid/set_dtc.inc' ; setting date,time,clock and alarm-clock
include 'sound/playnote.inc'
;include 'bus/pci/pci32.inc'
;include 'bus/usb/init.inc'
;include 'blkdev/flp_drv.inc' ; floppy driver
;include 'blkdev/fdc.inc'
;include 'blkdev/cd_drv.inc' ; CD driver
;include 'blkdev/ide_cache.inc' ; CD cache
;include 'blkdev/hd_drv.inc' ; HDD driver
;include 'blkdev/bd_drv.inc' ; BIOS disks driver
include 'blkdev/rd.inc' ; ramdisk driver
include 'blkdev/disk.inc'
include 'blkdev/disk_cache.inc'
include 'fs/fs_lfn.inc'
include 'network/stack.inc'
include 'crc.inc'
include 'unicode.inc'
include 'acpi/acpi.inc'
include 'unpacker.inc'
LIBCRASH_CTX_LEN = 0x500 ; FIXME
include 'sha3.asm'
; TODO: stdcall attribute in umka.h
proc sha3_256_oneshot c uses ebx esi edi ebp, _ctx, _data, _len
stdcall sha3_256.oneshot, [_ctx], [_data], [_len]
ret
endp
proc kos_time_to_epoch c uses ebx esi edi ebp, _time
mov esi, [_time]
call fsCalculateTime
xor edx, edx
add eax, UNIXTIME_TO_KOS_OFFSET
adc edx, 0
ret
endp
proc umka._.check_alignment
mov eax, HEAP_BASE
and eax, PAGE_SIZE - 1
jz @f
mov ecx, PAGE_SIZE
sub ecx, eax
DEBUGF 4, "HEAP_BASE must be aligned on PAGE_SIZE: 0x%x", HEAP_BASE
DEBUGF 4, ", add 0x%x or sub 0x%x\n", ecx, eax
2023-02-13 00:13:49 +01:00
mov eax, SLOT_BASE
and eax, 0x10000 - 1
jz @f
mov eax, os_base
and eax, 0x100000 - 1
jz @f
int3
@@:
ret
endp
2021-12-12 11:35:35 +01:00
pubsym i40_asm
2021-12-04 18:58:16 +01:00
;void i40_asm(uint32_t _eax,
; uint32_t _ebx,
; uint32_t _ecx,
; uint32_t _edx,
; uint32_t _esi,
; uint32_t _edi,
; uint32_t _ebp,
; uint32_t *_eax_out,
; uint32_t _ebx_out)
i40_asm:
; Return address: esp
; First argument: esp + 4
push eax ebx ecx edx esi edi ebp
; First argument: esp + 4 + 7 * sizeof(dword) = esp + 8 + 7 * 4 = esp + 4 + 28 = esp + 32
mov eax, [esp + 32]
mov ebx, [esp + 36]
mov ecx, [esp + 40]
mov edx, [esp + 44]
mov esi, [esp + 48]
mov edi, [esp + 52]
mov ebp, [esp + 56]
call i40
mov edi, [esp + 60]
mov [edi], eax
mov edi, [esp + 64]
mov [edi], ebx
pop ebp edi esi edx ecx ebx eax
ret
2021-12-12 11:35:35 +01:00
pubsym set_eflags_tf
2021-12-04 18:58:16 +01:00
proc set_eflags_tf c uses ebx esi edi ebp, tf
mov ecx, [tf]
pushfd
pop eax
ror eax, 8
mov edx, eax
and edx, 1
and eax, 0xfffffffe
or eax, ecx
rol eax, 8
push eax
popfd
mov eax, edx
ret
endp
proc kos_eth_input c uses ebx esi edi ebp, buffer_ptr
push .retaddr
push [buffer_ptr]
jmp eth_input
.retaddr:
ret
endp
struct umka_ctx
booted dd ?
running dd ?
ends
proc umka_init c uses ebx esi edi ebp, _running
call umka._.check_alignment
; init boot vars
mov eax, BOOT
mov [eax + boot_data.x_res], UMKA_BOOT_DEFAULT_DISPLAY_WIDTH
mov [eax + boot_data.y_res], UMKA_BOOT_DEFAULT_DISPLAY_HEIGHT
mov [eax + boot_data.bpp], UMKA_BOOT_DEFAULT_DISPLAY_BPP
mov [eax + boot_data.pitch], UMKA_BOOT_DEFAULT_DISPLAY_BPP * \
UMKA_BOOT_DEFAULT_DISPLAY_WIDTH / 8
2023-02-13 00:13:49 +01:00
mov [eax + boot_data.memmap_block_cnt], 1
lea ecx, [eax + boot_data.memmap_blocks]
mov [ecx + e820entry.addr.lo], mem_block
mov [ecx + e820entry.addr.hi], 0
mov [ecx + e820entry.size.lo], 256*0x10000
mov [ecx + e820entry.size.hi], 0
mov [ecx + e820entry.type], 1
; init umka context
mov eax, umka
mov [eax+umka_ctx.booted], 0
mov ecx, [_running]
mov [eax+umka_ctx.running], ecx
ret
endp
proc umka_close c, _ctx
xor eax, eax
ret
endp
proc umka_boot uses ebx esi edi ebp
mov [umka.booted], 1
mov edi, endofcode
mov ecx, uglobals_size
xor eax, eax
rep stosb
2023-02-13 00:13:49 +01:00
call mem_test
; call init_mem
2022-05-30 19:47:49 +02:00
; call init_page_map
mov [irq_mode], IRQ_APIC
mov [IOAPIC_base], ioapic_data
mov [LAPIC_BASE], lapic_data
mov [ioapic_cnt], 1
2022-05-30 19:47:49 +02:00
mov [xsave_area_size], 0x1000
mov ecx, pg_data.mutex
call mutex_init
mov ecx, disk_list_mutex
call mutex_init
mov ecx, keyboard_list_mutex
call mutex_init
mov ecx, unpack_mutex
call mutex_init
mov ecx, application_table_mutex
call mutex_init
mov ecx, ide_mutex
call mutex_init
mov ecx, ide_channel1_mutex
call mutex_init
mov ecx, ide_channel2_mutex
call mutex_init
mov ecx, ide_channel3_mutex
call mutex_init
mov ecx, ide_channel4_mutex
call mutex_init
mov ecx, ide_channel5_mutex
call mutex_init
mov ecx, ide_channel6_mutex
call mutex_init
mov [pg_data.mem_amount], UMKA_MEMORY_BYTES
mov [pg_data.pages_count], UMKA_MEMORY_BYTES / PAGE_SIZE
mov [pg_data.pages_free], UMKA_MEMORY_BYTES / PAGE_SIZE
mov eax, UMKA_MEMORY_BYTES SHR 12
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
mov eax, sys_proc
list_init eax
add eax, PROC.thr_list
list_init eax
mov [BOOT.lfb], LFB_BASE
call init_video
stdcall alloc_kernel_space, 0x50000 ; FIXME check size
mov [default_io_map], eax
add eax, 0x2000
mov [ipc_tmp], eax
mov ebx, 0x1000
add eax, 0x40000
mov [proc_mem_map], eax
add eax, 0x8000
mov [proc_mem_pdir], eax
add eax, ebx
mov [proc_mem_tab], eax
add eax, ebx
mov [tmp_task_ptab], eax
add eax, ebx
mov [ipc_pdir], eax
add eax, ebx
mov [ipc_ptab], eax
2020-02-08 19:27:29 +01:00
stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
(unpack.lc+unpack.lp)))*4
mov [unpack.p], eax
call init_events
mov eax, srv.fd-SRV.fd
mov [srv.fd], eax
mov [srv.bk], eax
stdcall kernel_alloc, [_display.win_map_size]
2020-02-04 22:53:24 +01:00
mov [_display.win_map], eax
; set background
movi eax, 1
2020-02-04 22:53:24 +01:00
mov [BgrDrawMode], eax
mov [BgrDataWidth], eax
mov [BgrDataHeight], eax
mov [mem_BACKGROUND], 4
mov [img_background], static_background_data
; set clipboard
xor eax, eax
mov [clipboard_slots], eax
mov [clipboard_write_lock], eax
stdcall kernel_alloc, 4096
test eax, eax
jnz @f
dec eax
@@:
mov [clipboard_main_list], eax
mov dword[sysdir_name], 'sys'
mov dword[sysdir_path], 'RD/1'
mov word[sysdir_path+4], 0
;call ramdisk_init
mov [X_UNDER], 500
mov [Y_UNDER], 500
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
2021-06-23 18:43:26 +02:00
mov [current_slot_idx], 0
mov [thread_count], 0
mov eax, [xsave_area_size]
add eax, RING0_STACK_SIZE
stdcall kernel_alloc, eax
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
mov ecx, IDLE_PRIORITY
call scheduler_add_thread
mov eax, [xsave_area_size]
add eax, RING0_STACK_SIZE
stdcall kernel_alloc, eax
mov ebx, eax
mov edx, SLOT_BASE+sizeof.APPDATA*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
movi ecx, MAX_PRIORITY
call scheduler_add_thread
2021-06-23 18:43:26 +02:00
mov [current_slot_idx], 2
mov [thread_count], 2
mov [current_slot], SLOT_BASE+2*sizeof.APPDATA
mov [SLOT_BASE + 2*sizeof.APPDATA + APPDATA.tid], 2
call set_window_defaults
call init_background
call calculatebackground
call init_display
mov eax, [def_cursor]
mov [window_data + sizeof.WDATA + WDATA.cursor], eax
mov [window_data + sizeof.WDATA*2 + WDATA.cursor], eax
; from set_variables
mov ax, [BOOT.y_res]
shr ax, 1
shl eax, 16
mov ax, [BOOT.x_res]
shr ax, 1
mov [MOUSE_X], eax
call wakeup_osloop
xor eax, eax
mov [BTN_ADDR], dword BUTTON_INFO ; address of button list
mov byte [KEY_COUNT], al ; keyboard buffer
mov byte [BTN_COUNT], al ; button buffer
mov ebx, SLOT_BASE + 2*sizeof.APPDATA
mov word[cur_dir.path], '/'
mov [ebx+APPDATA.cur_dir], cur_dir
; end of set_variables
call init_irqs
ret
endp
2021-12-12 11:35:35 +01:00
pubsym skin_udata
proc idle uses ebx esi edi
2023-01-12 22:24:06 +01:00
sti
@@:
mov [idle_scheduled], 1
sfence
if ~ HOST eq windows
extrn "pause", 0, libc_pause
call libc_pause
end if
jmp @b
ret
endp
2021-12-12 11:35:35 +01:00
extrn pci_read, 20
proc _pci_read_reg uses ebx esi edi
mov ecx, eax
and ecx, 3
movi edx, 1
shl edx, cl
push edx ; len
movzx edx, bl
push edx ; offset
movzx edx, bh
and edx, 7
push edx ; fun
movzx edx, bh
shr edx, 3
push edx ; dev
movzx edx, ah
push edx ; bus
call pci_read
ret
endp
2023-01-12 22:24:06 +01:00
proc _page_fault_handler
ret
endp
proc delay_ms
ret
endp
2021-12-12 11:35:35 +01:00
pubsym umka_cli
proc umka_cli
cli ; macro
ret
endp
2021-12-12 11:35:35 +01:00
pubsym umka_sti
proc umka_sti
sti ; macro
ret
endp
extrn reset_procmask
extrn get_fake_if
2021-12-12 11:35:35 +01:00
pubsym irq0
proc irq0 c, _signo, _info, _context
DEBUGF 1, "### irq0\n"
pushfd
cli
pushad
inc [timer_ticks]
call updatecputimes
ccall reset_procmask ; kind of irq_eoi:ta
ccall get_fake_if, [_context]
test eax, eax
jnz @f
DEBUGF 1, "### cli\n"
jmp .done
@@:
mov bl, SCHEDULE_ANY_PRIORITY
call find_next_task
jz .done ; if there is only one running process
call _do_change_task
.done:
popad
popfd
2020-05-06 23:33:32 +02:00
ret
endp
2020-05-06 23:33:32 +02:00
proc _do_change_task
mov eax, [current_slot]
sub eax, SLOT_BASE
shr eax, 8
mov ecx, ebx
sub ecx, SLOT_BASE
shr ecx, 8
DEBUGF 1, "### switching task from %d to %d\n",eax,ecx
mov esi, ebx
xchg esi, [current_slot]
; set new stack after saving old
mov [esi+APPDATA.saved_esp], esp
mov esp, [ebx+APPDATA.saved_esp]
ret
endp
proc map_io_mem _base, _size, _flags
mov eax, [_base]
2020-05-09 06:34:28 +02:00
ret
endp
2020-02-27 22:22:44 +01:00
;proc user_alloc_at stdcall, address:dword, alloc_size:dword
; xor eax, eax
; ret
;endp
extrn system_shutdown
sysfn_saveramdisk:
2022-05-30 19:47:49 +02:00
;sysfn_meminfo:
check_fdd_motor_status:
check_ATAPI_device_event:
check_fdd_motor_status_has_work?:
check_ATAPI_device_event_has_work?:
LoadMedium:
clear_CD_cache:
allow_medium_removal:
EjectMedium:
save_image:
init_sys_v86:
2022-05-30 19:47:49 +02:00
;load_pe_driver:
usb_init:
fdc_init:
mtrr_validate:
2023-01-12 22:24:06 +01:00
v86_exc_c:
except_7:
ReadCDWRetr:
WaitUnitReady:
prevent_medium_removal:
Read_TOC:
free_page:
init_fpu:
init_mtrr:
create_trampoline_pgmap:
2020-02-27 22:22:44 +01:00
alloc_page:
2022-05-30 19:47:49 +02:00
;sys_IPC:
;f68:
v86_irq:
2022-05-30 19:47:49 +02:00
;test_cpu:
;acpi_locate:
;init_BIOS32:
;mem_test:
;init_mem:
;init_page_map:
ahci_init:
enable_acpi:
acpi.call_name:
acpi.count_nodes:
acpi.aml.init:
aml._.attach:
acpi.fill_pci_irqs:
pci.walk_tree:
acpi.aml.new_thread:
aml._.alloc_node:
aml._.constructor.integer:
aml._.constructor.package:
acpi._.lookup_node:
acpi._.print_tree:
2020-02-06 04:19:20 +01:00
ret
2022-05-30 19:47:49 +02:00
load_PE:
2020-02-27 22:22:44 +01:00
alloc_pages:
ret 4
2022-05-30 19:47:49 +02:00
;create_ring_buffer:
2020-02-27 22:22:44 +01:00
ret 8
2022-05-30 19:47:49 +02:00
;map_page:
2020-02-27 22:22:44 +01:00
ret 12
2022-05-30 19:47:49 +02:00
;map_memEx:
2020-02-27 22:22:44 +01:00
ret 20
uglobal
acpi_ctx dd ?
acpi_usage dd ?
acpi_node_alloc_cnt dd ?
acpi_node_free_cnt dd ?
pci_root dd ?
acpi_root dd ?
acpi_dev_next dd ?
endg
2020-12-09 15:15:54 +01:00
delay_ms equ __pex1
include fix pew
2020-02-27 22:22:44 +01:00
macro pew x {}
macro pew x {inclu#de `x}
macro org x {}
2020-02-27 22:22:44 +01:00
macro format [x] {}
UMKA_RUNNIGS_NEVER = 0
UMKA_RUNNIGS_NOT_YET = 1
UMKA_RUNNIGS_YES = 2
bios32_entry equ bios32_entry_pew
tmp_page_tabs equ tmp_page_tabs_pew
macro jmp target {
if target eq osloop
mov [os_scheduled], 1
cmp [umka.running], UMKA_RUNNIGS_YES
jz osloop
ret
else
jmp target
end if
}
include 'kernel.asm'
purge jmp
restore bios32_entry, tmp_page_tabs
purge org,delay_ms
restore org,delay_ms
2019-10-09 01:35:47 +02:00
coverage_end:
; cov for coverage; otherwide fasm complains with 'name too long' for MS COFF
section '.bss.cov' executable writable align 64
2022-06-13 23:46:48 +02:00
struct coverage_branch
to_cnt DQ ?
from_cnt DQ ?
ends
COVERAGE_TABLE_SIZE = 512*1024 ; 512k should be enough for the kernel
coverage_table rb COVERAGE_TABLE_SIZE * sizeof.coverage_branch
pubsym coverage_table
; bt for boot; otherwide fasm complains with 'name too long' for MS COFF
section '.data.bt' writeable align 0x1000
BOOT boot_data
virtual at BOOT
BOOT_LO boot_data
end virtual
2023-02-13 00:13:49 +01:00
; fasm doesn't align on 65536, but ld script does
; 64 for align on 64k; otherwide fasm complains with 'name too long' for MS COFF
section '.data.64' writeable align 0x1000
umka umka_ctx
fpu_owner dd ?
idle_scheduled dd ?
os_scheduled dd ?
2020-02-04 22:53:24 +01:00
2023-02-13 00:13:49 +01:00
; mem for memory; otherwide fasm complains with 'name too long' for MS COFF
section '.bss.mem' writeable align 0x1000
mem_block rb 256*0x10000
2020-12-17 17:42:14 +01:00
uglobal
align 64
2023-02-13 00:13:49 +01:00
rb 0x100000 - (($-bss_base) AND (0x100000-1)) ; align on 1MiB
os_base: rb PAGE_SIZE
window_data: rb sizeof.WDATA * 256
background_window = window_data + sizeof.WDATA
idts rb (NUM_EXCEPTIONS + IRQ_RESERVED) * sizeof.idt_entry
2021-07-17 04:15:14 +02:00
WIN_STACK rw 0x200 ; why not 0x100?
WIN_POS rw 0x200
FDD_BUFF: rb 0x400
2020-12-17 17:42:14 +01:00
WIN_TEMP_XY rb 0x100
KEY_COUNT db ?
KEY_BUFF rb 244 ; 120*2 + 2*2 = 244 bytes, actually 255 bytes
2020-12-17 17:42:14 +01:00
BTN_COUNT db ?
BTN_BUFF rd 0x261
BTN_ADDR dd ?
MEM_AMOUNT rd 0x1d
SYS_SHUTDOWN db ?
2021-07-17 04:15:14 +02:00
sys_proc: rb sizeof.PROC * 256
rb 0x10000 - (($-bss_base) AND (0x10000-1)) ; align on 0x10000
SLOT_BASE: rb sizeof.APPDATA * 256
2020-12-17 17:42:14 +01:00
VGABasePtr rb 640*480
rb PAGE_SIZE - (($-bss_base) AND (PAGE_SIZE-1)) ; align on page
HEAP_BASE rb UMKA_MEMORY_BYTES - (HEAP_BASE - os_base + \
PAGE_SIZE * sizeof.MEM_BLOCK)
2020-12-17 17:42:14 +01:00
endg
uglobal
align 4
bios32_entry dd ?
tmp_page_tabs dd ?
2022-05-30 19:47:49 +02:00
page_tabs:
rb 256*1024*1024
v86_irqhooks rd IRQ_RESERVED*2
cache_ide0 IDE_CACHE
cache_ide1 IDE_CACHE
DiskNumber db ?
ChannelNumber db ?
DevErrorCode dd ?
CDSectorAddress dd ?
CDDataBuf_pointer dd ?
allow_dma_access db ?
ide_mutex MUTEX
ide_channel1_mutex MUTEX
ide_channel2_mutex MUTEX
ide_channel3_mutex MUTEX
ide_channel4_mutex MUTEX
ide_channel5_mutex MUTEX
ide_channel6_mutex MUTEX
ide_channel7_mutex MUTEX
ide_channel8_mutex MUTEX
ioapic_data rb 0x400
lapic_data rb 0x400
tss TSS
lfb_base rd MAX_SCREEN_WIDTH*MAX_SCREEN_HEIGHT
align 4096
cur_dir:
.encoding rb 1
.path rb maxPathLength
2020-02-04 22:53:24 +01:00
BgrAuxTable rb 32768
BgrAuxTable equ
SB16Buffer rb 65536
SB16Buffer equ
BUTTON_INFO rb 64*1024
BUTTON_INFO equ
endg
2020-02-04 22:53:24 +01:00
2020-09-18 05:00:32 +02:00
macro org x {
if x eq (OS_BASE+0x0100000)
else
org x
end if
}
macro align x {
if x eq 65536
else if x eq 4096
else
align x
end if
}
macro assert [x] {}
macro dw [x] {
forward
if x eq tss and 0xFFFF
dw 0
else if x eq (tss shr 16) and 0xFF00
dw 0
2023-01-12 22:24:06 +01:00
else if x eq i40 and 0xFFFF
dw 0
else if x eq i40 shr 16
dw 0
else
dw x
end if
}
macro db [x] {
forward
if x eq (tss shr 16) and 0xFF
db 0
else
db x
end if
}
include 'data32.inc'