Ivan Baravy
5822be9942
It is useless since host OS cache is used anyway. It also slows down coverage collection because of many taken branches. Specialized tests should be written to test disk cache specifically.
433 lines
9.5 KiB
NASM
433 lines
9.5 KiB
NASM
format ELF
|
|
|
|
__DEBUG__ = 1
|
|
__DEBUG_LEVEL__ = 1
|
|
|
|
public disk_add
|
|
public disk_del
|
|
public disk_list
|
|
public disk_media_changed
|
|
|
|
public xfs._.user_functions as 'xfs_user_functions'
|
|
public ext_user_functions
|
|
public fat_user_functions
|
|
public ntfs_user_functions
|
|
|
|
public i40
|
|
|
|
public coverage_begin
|
|
public coverage_end
|
|
|
|
public sha3_256_oneshot as 'hash_oneshot'
|
|
public kos_time_to_epoch
|
|
public kos_init
|
|
|
|
public win_stack_addr as 'kos_win_stack'
|
|
public win_pos_addr as 'kos_win_pos'
|
|
public lfb_base_addr as 'kos_lfb_base'
|
|
|
|
cli equ nop
|
|
iretd equ retd
|
|
|
|
lang fix en
|
|
|
|
macro int n {
|
|
if n eq 0x40
|
|
call i40
|
|
else
|
|
int n
|
|
end if
|
|
}
|
|
|
|
UEFI = 1
|
|
|
|
MAX_PRIORITY = 0 ; highest, used for kernel tasks
|
|
USER_PRIORITY = 1 ; default
|
|
IDLE_PRIORITY = 2 ; lowest, only IDLE thread goes here
|
|
|
|
section '.text' executable align 32
|
|
|
|
coverage_begin:
|
|
|
|
include 'macros.inc'
|
|
macro diff16 msg,blah2,blah3 {
|
|
if msg eq "end of .data segment"
|
|
section '.bss' writeable align 64
|
|
end if
|
|
}
|
|
include 'proc32.inc'
|
|
include 'struct.inc'
|
|
macro BOOT_LO a {}
|
|
macro BOOT a {}
|
|
window_data equ twer
|
|
CURRENT_TASK equ twer2
|
|
TASK_COUNT equ gyads
|
|
SLOT_BASE equ gfdskh
|
|
include 'const.inc'
|
|
restore window_data
|
|
restore CURRENT_TASK
|
|
restore TASK_COUNT
|
|
restore SLOT_BASE
|
|
purge BOOT_LO,BOOT
|
|
|
|
LFB_BASE = lfb_base
|
|
|
|
;window_data = os_base + 0x00001000
|
|
;CURRENT_TASK = os_base + 0x00003000
|
|
;TASK_COUNT = os_base + 0x00003004
|
|
TASK_BASE = os_base + 0x00003010
|
|
TASK_DATA = os_base + 0x00003020
|
|
TASK_EVENT = os_base + 0x00003020
|
|
CDDataBuf = os_base + 0x00005000
|
|
idts = os_base + 0x0000B100
|
|
WIN_STACK = os_base + 0x0000C000
|
|
WIN_POS = os_base + 0x0000C400
|
|
FDD_BUFF = os_base + 0x0000D000
|
|
WIN_TEMP_XY = os_base + 0x0000F300
|
|
KEY_COUNT = os_base + 0x0000F400
|
|
KEY_BUFF = os_base + 0x0000F401 ; 120*2 + 2*2 = 244 bytes, actually 255 bytes
|
|
BTN_COUNT = os_base + 0x0000F500
|
|
BTN_BUFF = os_base + 0x0000F501
|
|
BTN_ADDR = os_base + 0x0000FE88
|
|
MEM_AMOUNT = os_base + 0x0000FE8C
|
|
SYS_SHUTDOWN = os_base + 0x0000FF00
|
|
TASK_ACTIVATE = os_base + 0x0000FF01
|
|
sys_proc = os_base + 0x0006F000
|
|
SLOT_BASE = os_base + 0x00080000
|
|
VGABasePtr = os_base + 0x000A0000
|
|
UPPER_KERNEL_PAGES = os_base + 0x00400000
|
|
HEAP_BASE = os_base + 0x00800000
|
|
|
|
include 'system.inc'
|
|
include 'fdo.inc'
|
|
include 'blkdev/disk.inc'
|
|
include 'blkdev/disk_cache.inc'
|
|
include 'fs/fs_lfn.inc'
|
|
include 'crc.inc'
|
|
include 'unicode.inc'
|
|
include 'core/string.inc'
|
|
include 'core/malloc.inc'
|
|
include 'core/heap.inc'
|
|
include 'core/dll.inc'
|
|
include 'core/taskman.inc'
|
|
include 'core/timers.inc'
|
|
include 'core/clipboard.inc'
|
|
include 'core/syscall.inc'
|
|
include 'video/framebuffer.inc'
|
|
include 'video/vesa20.inc'
|
|
include 'video/vga.inc'
|
|
include 'video/blitter.inc'
|
|
include 'video/cursors.inc'
|
|
include 'sound/playnote.inc'
|
|
include 'unpacker.inc'
|
|
include 'gui/window.inc'
|
|
include 'gui/button.inc'
|
|
include 'gui/skincode.inc'
|
|
include 'gui/font.inc'
|
|
include 'gui/event.inc'
|
|
include 'gui/mouse.inc'
|
|
include 'hid/keyboard.inc'
|
|
include 'hid/mousedrv.inc'
|
|
include 'network/stack.inc'
|
|
|
|
include 'sha3.asm'
|
|
|
|
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
|
|
add eax, 978307200 ; epoch to 2001.01.01
|
|
ret
|
|
endp
|
|
|
|
proc kos_init c uses ebx esi edi ebp
|
|
mov edi, endofcode
|
|
mov ecx, uglobals_size
|
|
xor eax, eax
|
|
rep stosb
|
|
|
|
MEMORY_BYTES = 128 SHL 20
|
|
DISPLAY_WIDTH = 400
|
|
DISPLAY_HEIGHT = 300
|
|
mov [pg_data.mem_amount], MEMORY_BYTES
|
|
mov [pg_data.pages_count], MEMORY_BYTES / PAGE_SIZE
|
|
mov [pg_data.pages_free], MEMORY_BYTES / PAGE_SIZE
|
|
mov eax, MEMORY_BYTES SHR 12
|
|
mov [pg_data.kernel_pages], eax
|
|
shr eax, 10
|
|
mov [pg_data.kernel_tables], eax
|
|
call init_kernel_heap
|
|
call init_malloc
|
|
|
|
mov [BOOT.bpp], 32
|
|
mov [BOOT.x_res], 400
|
|
mov [BOOT.y_res], 300
|
|
mov [BOOT.pitch], 400*4
|
|
mov [BOOT.lfb], LFB_BASE
|
|
call init_video
|
|
|
|
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
|
|
|
|
mov dword[sysdir_name], 'sys'
|
|
mov dword[sysdir_path], 'RD/1'
|
|
mov word[sysdir_path+4], 0
|
|
|
|
mov dword[CURRENT_TASK], 2
|
|
mov dword[TASK_COUNT], 2
|
|
mov dword[TASK_BASE], CURRENT_TASK + 2*sizeof.TASKDATA
|
|
mov [current_slot], SLOT_BASE + 256*2
|
|
|
|
;call ramdisk_init
|
|
|
|
mov ebx, SLOT_BASE + 2*256
|
|
stdcall kernel_alloc, 0x2000
|
|
mov [ebx+APPDATA.process], eax
|
|
mov word[cur_dir.path], '/'
|
|
mov [ebx+APPDATA.cur_dir], cur_dir
|
|
mov [ebx+APPDATA.wnd_clientbox.left], 0
|
|
mov [ebx+APPDATA.wnd_clientbox.top], 0
|
|
|
|
mov [X_UNDER], 500
|
|
mov [Y_UNDER], 500
|
|
mov word[MOUSE_X], 40
|
|
mov word[MOUSE_Y], 30
|
|
|
|
stdcall kernel_alloc, [_display.win_map_size]
|
|
mov [_display.win_map], eax
|
|
|
|
; set background
|
|
movi eax, 1
|
|
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
|
|
|
|
|
|
call set_window_defaults
|
|
call init_background
|
|
call calculatebackground
|
|
call init_display
|
|
mov eax, [def_cursor]
|
|
mov [SLOT_BASE+APPDATA.cursor+256], eax
|
|
mov [SLOT_BASE+APPDATA.cursor+256*2], eax
|
|
|
|
; from set_variables
|
|
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
|
|
|
|
;call load_default_skin
|
|
;call stack_init
|
|
|
|
ret
|
|
endp
|
|
|
|
proc sys_msg_board
|
|
cmp cl, 0x0d
|
|
jz @f
|
|
pushad
|
|
mov eax, SYS_WRITE
|
|
mov ebx, STDOUT
|
|
push ecx
|
|
mov ecx, esp
|
|
mov edx, 1
|
|
int 0x80
|
|
pop ecx
|
|
popad
|
|
@@:
|
|
ret
|
|
endp
|
|
|
|
change_task:
|
|
mov [REDRAW_BACKGROUND], 0
|
|
ret
|
|
|
|
|
|
sysfn_saveramdisk:
|
|
sysfn_meminfo:
|
|
check_fdd_motor_status:
|
|
check_ATAPI_device_event:
|
|
check_fdd_motor_status_has_work?:
|
|
check_ATAPI_device_event_has_work?:
|
|
get_clock_ns:
|
|
request_terminate:
|
|
system_shutdown:
|
|
terminate:
|
|
LoadMedium:
|
|
clear_CD_cache:
|
|
allow_medium_removal:
|
|
EjectMedium:
|
|
save_image:
|
|
init_irqs:
|
|
PIC_init:
|
|
init_sys_v86:
|
|
PIT_init:
|
|
ramdisk_init:
|
|
APIC_init:
|
|
unmask_timer:
|
|
pci_enum:
|
|
load_pe_driver:
|
|
usb_init:
|
|
fdc_init:
|
|
attach_int_handler:
|
|
mtrr_validate:
|
|
protect_from_terminate:
|
|
unprotect_from_terminate:
|
|
ReadCDWRetr:
|
|
WaitUnitReady:
|
|
prevent_medium_removal:
|
|
Read_TOC:
|
|
commit_pages:
|
|
release_pages:
|
|
mutex_init:
|
|
mutex_lock:
|
|
mutex_unlock:
|
|
lock_application_table:
|
|
unlock_application_table:
|
|
get_pg_addr:
|
|
free_page:
|
|
scheduler_add_thread:
|
|
build_interrupt_table:
|
|
init_fpu:
|
|
init_mtrr:
|
|
map_io_mem:
|
|
create_trampoline_pgmap:
|
|
alloc_page:
|
|
|
|
sys_settime:
|
|
sys_pcibios:
|
|
sys_IPC:
|
|
pci_api:
|
|
sys_resize_app_memory:
|
|
f68:
|
|
sys_posix:
|
|
ret
|
|
|
|
alloc_pages:
|
|
enable_irq:
|
|
disable_irq:
|
|
ret 4
|
|
create_ring_buffer:
|
|
ret 8
|
|
map_page:
|
|
ret 12
|
|
map_memEx:
|
|
ret 20
|
|
|
|
|
|
HEAP_BASE equ
|
|
include 'init.inc'
|
|
sys_msg_board equ __pew
|
|
|
|
include fix pew
|
|
macro pew x {}
|
|
macro pew x {inclu#de `x}
|
|
macro org x {}
|
|
macro format [x] {}
|
|
|
|
macro lea r, v {
|
|
if v eq [(ecx-(CURRENT_TASK and 1FFFFFFFh)-TASKDATA.state)*8+SLOT_BASE]
|
|
int3
|
|
else if v eq [(edx-(CURRENT_TASK and 1FFFFFFFh))*8+SLOT_BASE]
|
|
int3
|
|
else
|
|
lea r, v
|
|
end if
|
|
}
|
|
|
|
macro add r, v {
|
|
if v eq CURRENT_TASK - (SLOT_BASE shr 3)
|
|
int3
|
|
else
|
|
add r, v
|
|
end if
|
|
}
|
|
|
|
include 'kernel.asm'
|
|
|
|
purge lea,add,org
|
|
restore lea,add,org
|
|
purge sys_msg_board,HEAP_BASE
|
|
|
|
coverage_end:
|
|
|
|
|
|
section '.data' writeable align 64
|
|
timer_ticks dd 0
|
|
fpu_owner dd ?
|
|
|
|
win_stack_addr dd WIN_STACK
|
|
win_pos_addr dd WIN_POS
|
|
lfb_base_addr dd lfb_base
|
|
|
|
uglobal
|
|
context_counter dd ?
|
|
LAPIC_BASE dd ?
|
|
irq_mode dd ?
|
|
ioapic_cnt dd ?
|
|
ioapic_gsi_base dd ?
|
|
MAX_IOAPICS = 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
|
|
os_base: rb 0x1000
|
|
window_data: rb 0x2000
|
|
CURRENT_TASK: rb 4
|
|
TASK_COUNT: rb 12
|
|
rb 0x1000000
|
|
BOOT_LO boot_data
|
|
BOOT boot_data
|
|
lfb_base rd MAX_SCREEN_WIDTH*MAX_SCREEN_HEIGHT
|
|
cur_dir:
|
|
.encoding rb 1
|
|
.path rb maxPathLength
|
|
|
|
BgrAuxTable rb 32768
|
|
BgrAuxTable equ
|
|
SB16Buffer rb 65536
|
|
SB16Buffer equ
|
|
BUTTON_INFO rb 64*1024
|
|
BUTTON_INFO equ
|
|
endg
|
|
|
|
include 'data32.inc'
|