Working prototype.
This commit is contained in:
parent
397aba3a06
commit
54fe4859ee
939
const.inc
Normal file
939
const.inc
Normal file
@ -0,0 +1,939 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 6929 $
|
||||
|
||||
|
||||
dpl0 equ 10010000b ; data read dpl0
|
||||
drw0 equ 10010010b ; data read/write dpl0
|
||||
drw3 equ 11110010b ; data read/write dpl3
|
||||
cpl0 equ 10011010b ; code read dpl0
|
||||
cpl3 equ 11111010b ; code read dpl3
|
||||
|
||||
D32 equ 01000000b ; 32bit segment
|
||||
G32 equ 10000000b ; page gran
|
||||
|
||||
|
||||
;;;;;;;;;;;;cpu_caps flags;;;;;;;;;;;;;;;;
|
||||
|
||||
CPU_386 equ 3
|
||||
CPU_486 equ 4
|
||||
CPU_PENTIUM equ 5
|
||||
CPU_P6 equ 6
|
||||
CPU_PENTIUM4 equ 0x0F
|
||||
|
||||
CAPS_FPU equ 00 ;on-chip x87 floating point unit
|
||||
CAPS_VME equ 01 ;virtual-mode enhancements
|
||||
CAPS_DE equ 02 ;debugging extensions
|
||||
CAPS_PSE equ 03 ;page-size extensions
|
||||
CAPS_TSC equ 04 ;time stamp counter
|
||||
CAPS_MSR equ 05 ;model-specific registers
|
||||
CAPS_PAE equ 06 ;physical-address extensions
|
||||
CAPS_MCE equ 07 ;machine check exception
|
||||
CAPS_CX8 equ 08 ;CMPXCHG8B instruction
|
||||
CAPS_APIC equ 09 ;on-chip advanced programmable
|
||||
; interrupt controller
|
||||
; 10 ;unused
|
||||
CAPS_SEP equ 11 ;SYSENTER and SYSEXIT instructions
|
||||
CAPS_MTRR equ 12 ;memory-type range registers
|
||||
CAPS_PGE equ 13 ;page global extension
|
||||
CAPS_MCA equ 14 ;machine check architecture
|
||||
CAPS_CMOV equ 15 ;conditional move instructions
|
||||
CAPS_PAT equ 16 ;page attribute table
|
||||
|
||||
CAPS_PSE36 equ 17 ;page-size extensions
|
||||
CAPS_PSN equ 18 ;processor serial number
|
||||
CAPS_CLFLUSH equ 19 ;CLFUSH instruction
|
||||
|
||||
CAPS_DS equ 21 ;debug store
|
||||
CAPS_ACPI equ 22 ;thermal monitor and software
|
||||
;controlled clock supported
|
||||
CAPS_MMX equ 23 ;MMX instructions
|
||||
CAPS_FXSR equ 24 ;FXSAVE and FXRSTOR instructions
|
||||
CAPS_SSE equ 25 ;SSE instructions
|
||||
CAPS_SSE2 equ 26 ;SSE2 instructions
|
||||
CAPS_SS equ 27 ;self-snoop
|
||||
CAPS_HTT equ 28 ;hyper-threading technology
|
||||
CAPS_TM equ 29 ;thermal monitor supported
|
||||
CAPS_IA64 equ 30 ;IA64 capabilities
|
||||
CAPS_PBE equ 31 ;pending break enable
|
||||
|
||||
;ecx
|
||||
CAPS_SSE3 equ 32 ;SSE3 instructions
|
||||
; 33
|
||||
; 34
|
||||
CAPS_MONITOR equ 35 ;MONITOR/MWAIT instructions
|
||||
CAPS_DS_CPL equ 36 ;
|
||||
CAPS_VMX equ 37 ;virtual mode extensions
|
||||
; 38 ;
|
||||
CAPS_EST equ 39 ;enhansed speed step
|
||||
CAPS_TM2 equ 40 ;thermal monitor2 supported
|
||||
; 41
|
||||
CAPS_CID equ 42 ;
|
||||
; 43
|
||||
; 44
|
||||
CAPS_CX16 equ 45 ;CMPXCHG16B instruction
|
||||
CAPS_xTPR equ 46 ;
|
||||
;
|
||||
;reserved
|
||||
;
|
||||
;ext edx /ecx
|
||||
CAPS_SYSCAL equ 64 ;
|
||||
CAPS_XD equ 65 ;execution disable
|
||||
CAPS_FFXSR equ 66 ;
|
||||
CAPS_RDTSCP equ 67 ;
|
||||
CAPS_X64 equ 68 ;
|
||||
CAPS_3DNOW equ 69 ;
|
||||
CAPS_3DNOWEXT equ 70 ;
|
||||
CAPS_LAHF equ 71 ;
|
||||
CAPS_CMP_LEG equ 72 ;
|
||||
CAPS_SVM equ 73 ;secure virual machine
|
||||
CAPS_ALTMOVCR8 equ 74 ;
|
||||
|
||||
; CPU MSR names
|
||||
MSR_SYSENTER_CS equ 0x174
|
||||
MSR_SYSENTER_ESP equ 0x175
|
||||
MSR_SYSENTER_EIP equ 0x176
|
||||
MSR_CR_PAT equ 0x277
|
||||
MSR_MTRR_DEF_TYPE equ 0x2FF
|
||||
|
||||
MSR_AMD_EFER equ 0xC0000080 ; Extended Feature Enable Register
|
||||
MSR_AMD_STAR equ 0xC0000081 ; SYSCALL/SYSRET Target Address Register
|
||||
|
||||
CR0_PE equ 0x00000001 ;protected mode
|
||||
CR0_MP equ 0x00000002 ;monitor fpu
|
||||
CR0_EM equ 0x00000004 ;fpu emulation
|
||||
CR0_TS equ 0x00000008 ;task switch
|
||||
CR0_ET equ 0x00000010 ;extension type hardcoded to 1
|
||||
CR0_NE equ 0x00000020 ;numeric error
|
||||
CR0_WP equ 0x00010000 ;write protect
|
||||
CR0_AM equ 0x00040000 ;alignment check
|
||||
CR0_NW equ 0x20000000 ;not write-through
|
||||
CR0_CD equ 0x40000000 ;cache disable
|
||||
CR0_PG equ 0x80000000 ;paging
|
||||
|
||||
|
||||
CR4_VME equ 0x0001
|
||||
CR4_PVI equ 0x0002
|
||||
CR4_TSD equ 0x0004
|
||||
CR4_DE equ 0x0008
|
||||
CR4_PSE equ 0x0010
|
||||
CR4_PAE equ 0x0020
|
||||
CR4_MCE equ 0x0040
|
||||
CR4_PGE equ 0x0080
|
||||
CR4_PCE equ 0x0100
|
||||
CR4_OSFXSR equ 0x0200
|
||||
CR4_OSXMMEXPT equ 0x0400
|
||||
|
||||
SSE_IE equ 0x0001
|
||||
SSE_DE equ 0x0002
|
||||
SSE_ZE equ 0x0004
|
||||
SSE_OE equ 0x0008
|
||||
SSE_UE equ 0x0010
|
||||
SSE_PE equ 0x0020
|
||||
SSE_DAZ equ 0x0040
|
||||
SSE_IM equ 0x0080
|
||||
SSE_DM equ 0x0100
|
||||
SSE_ZM equ 0x0200
|
||||
SSE_OM equ 0x0400
|
||||
SSE_UM equ 0x0800
|
||||
SSE_PM equ 0x1000
|
||||
SSE_FZ equ 0x8000
|
||||
|
||||
SSE_INIT equ (SSE_IM+SSE_DM+SSE_ZM+SSE_OM+SSE_UM+SSE_PM)
|
||||
|
||||
IRQ_PIC equ 0
|
||||
IRQ_APIC equ 1
|
||||
|
||||
struct TSS
|
||||
_back rw 2
|
||||
_esp0 rd 1
|
||||
_ss0 rw 2
|
||||
_esp1 rd 1
|
||||
_ss1 rw 2
|
||||
_esp2 rd 1
|
||||
_ss2 rw 2
|
||||
_cr3 rd 1
|
||||
_eip rd 1
|
||||
_eflags rd 1
|
||||
_eax rd 1
|
||||
_ecx rd 1
|
||||
_edx rd 1
|
||||
_ebx rd 1
|
||||
_esp rd 1
|
||||
_ebp rd 1
|
||||
_esi rd 1
|
||||
_edi rd 1
|
||||
_es rw 2
|
||||
_cs rw 2
|
||||
_ss rw 2
|
||||
_ds rw 2
|
||||
_fs rw 2
|
||||
_gs rw 2
|
||||
_ldt rw 2
|
||||
_trap rw 1
|
||||
_io rw 1
|
||||
rb 24
|
||||
_io_map_0 rb 4096
|
||||
_io_map_1 rb 4096
|
||||
ends
|
||||
|
||||
DRIVE_DATA_SIZE equ 16
|
||||
|
||||
OS_BASE equ 0x80000000
|
||||
|
||||
window_data equ (OS_BASE+0x0001000)
|
||||
|
||||
CURRENT_TASK equ (OS_BASE+0x0003000)
|
||||
TASK_COUNT equ (OS_BASE+0x0003004)
|
||||
TASK_BASE equ (OS_BASE+0x0003010)
|
||||
TASK_DATA equ (OS_BASE+0x0003020)
|
||||
TASK_EVENT equ (OS_BASE+0x0003020)
|
||||
|
||||
CDDataBuf equ (OS_BASE+0x0005000)
|
||||
|
||||
;unused 0x6000 - 0x8fff
|
||||
|
||||
BOOT_VARS equ (OS_BASE) ;0x9000
|
||||
|
||||
idts equ (OS_BASE+0x000B100)
|
||||
WIN_STACK equ (OS_BASE+0x000C000)
|
||||
WIN_POS equ (OS_BASE+0x000C400)
|
||||
FDD_BUFF equ (OS_BASE+0x000D000) ;512
|
||||
|
||||
WIN_TEMP_XY equ (OS_BASE+0x000F300)
|
||||
KEY_COUNT equ (OS_BASE+0x000F400)
|
||||
KEY_BUFF equ (OS_BASE+0x000F401) ; 120*2 + 2*2 = 244 bytes, actually 255 bytes
|
||||
|
||||
BTN_COUNT equ (OS_BASE+0x000F500)
|
||||
BTN_BUFF equ (OS_BASE+0x000F501)
|
||||
|
||||
|
||||
BTN_ADDR equ (OS_BASE+0x000FE88)
|
||||
MEM_AMOUNT equ (OS_BASE+0x000FE8C)
|
||||
|
||||
SYS_SHUTDOWN equ (OS_BASE+0x000FF00)
|
||||
TASK_ACTIVATE equ (OS_BASE+0x000FF01)
|
||||
|
||||
|
||||
TMP_STACK_TOP equ 0x006CC00
|
||||
|
||||
sys_proc equ (OS_BASE+0x006F000)
|
||||
|
||||
SLOT_BASE equ (OS_BASE+0x0080000)
|
||||
|
||||
VGABasePtr equ (OS_BASE+0x00A0000)
|
||||
|
||||
CLEAN_ZONE equ (_CLEAN_ZONE-OS_BASE)
|
||||
|
||||
UPPER_KERNEL_PAGES equ (OS_BASE+0x0400000)
|
||||
|
||||
virtual at (OS_BASE+0x05FFF80)
|
||||
tss TSS
|
||||
end virtual
|
||||
|
||||
HEAP_BASE equ (OS_BASE+0x0800000)
|
||||
HEAP_MIN_SIZE equ 0x01000000
|
||||
|
||||
page_tabs equ 0xFDC00000
|
||||
app_page_tabs equ 0xFDC00000
|
||||
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
|
||||
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
|
||||
|
||||
LFB_BASE equ 0xFE000000
|
||||
|
||||
|
||||
new_app_base equ 0;
|
||||
|
||||
twdw equ 0x2000 ;(CURRENT_TASK-window_data)
|
||||
|
||||
std_application_base_address equ new_app_base
|
||||
RING0_STACK_SIZE equ (0x2000 - 512) ;512 байт для контекста FPU
|
||||
|
||||
REG_SS equ (RING0_STACK_SIZE-4)
|
||||
REG_APP_ESP equ (RING0_STACK_SIZE-8)
|
||||
REG_EFLAGS equ (RING0_STACK_SIZE-12)
|
||||
REG_CS equ (RING0_STACK_SIZE-16)
|
||||
REG_EIP equ (RING0_STACK_SIZE-20)
|
||||
REG_EAX equ (RING0_STACK_SIZE-24)
|
||||
REG_ECX equ (RING0_STACK_SIZE-28)
|
||||
REG_EDX equ (RING0_STACK_SIZE-32)
|
||||
REG_EBX equ (RING0_STACK_SIZE-36)
|
||||
REG_ESP equ (RING0_STACK_SIZE-40) ;RING0_STACK_SIZE-20
|
||||
REG_EBP equ (RING0_STACK_SIZE-44)
|
||||
REG_ESI equ (RING0_STACK_SIZE-48)
|
||||
REG_EDI equ (RING0_STACK_SIZE-52)
|
||||
REG_RET equ (RING0_STACK_SIZE-56) ;irq0.return
|
||||
|
||||
|
||||
PAGE_SIZE equ 4096
|
||||
|
||||
PG_UNMAP equ 0x000
|
||||
PG_READ equ 0x001
|
||||
PG_WRITE equ 0x002
|
||||
PG_USER equ 0x004
|
||||
PG_PCD equ 0x008
|
||||
PG_PWT equ 0x010
|
||||
PG_ACCESSED equ 0x020
|
||||
PG_DIRTY equ 0x040
|
||||
PG_PAT equ 0x080
|
||||
PG_GLOBAL equ 0x100
|
||||
PG_SHARED equ 0x200
|
||||
|
||||
PG_SWR equ 0x003 ; (PG_WRITE+PG_READ)
|
||||
PG_UR equ 0x005 ; (PG_USER+PG_READ)
|
||||
PG_UWR equ 0x007 ; (PG_USER+PG_WRITE+PG_READ)
|
||||
PG_NOCACHE equ 0x018 ; (PG_PCD+PG_PWT)
|
||||
|
||||
PDE_LARGE equ 0x080
|
||||
|
||||
PAT_WB equ 0x000
|
||||
PAT_WC equ 0x008
|
||||
PAT_UCM equ 0x010
|
||||
PAT_UC equ 0x018
|
||||
|
||||
PAT_TYPE_UC equ 0
|
||||
PAT_TYPE_WC equ 1
|
||||
PAT_TYPE_WB equ 6
|
||||
PAT_TYPE_UCM equ 7
|
||||
|
||||
PAT_VALUE equ 0x00070106; (UC<<24)|(UCM<<16)|(WC<<8)|WB
|
||||
|
||||
;;;;;;;;;;;boot time variables
|
||||
|
||||
BOOT_BPP equ 0x9000 ;byte bits per pixel
|
||||
BOOT_PITCH equ 0x9001 ;word scanline length
|
||||
BOOT_VESA_MODE equ 0x9008 ;word vesa video mode
|
||||
BOOT_X_RES equ 0x900A ;word X res
|
||||
BOOT_Y_RES equ 0x900C ;word Y res
|
||||
BOOT_BANK_SW equ 0x9014 ;dword Vesa 1.2 pm bank switch
|
||||
BOOT_LFB equ 0x9018 ;dword Vesa 2.0 LFB address
|
||||
BOOT_MTRR equ 0x901C ;byte 0 or 1 : enable MTRR graphics acceleration
|
||||
;BOOT_LOG equ 0x901D ;byte not used anymore (0 or 1 : enable system log display)
|
||||
BOOT_LAUNCHER_START equ 0x901D ;byte (0 or 1) start the first app (right now it's LAUNCHER) after kernel is loaded?
|
||||
;BOOT_DIRECT_LFB equ 0x901E ;byte 0 or 1 : enable direct lfb write, paging disabled
|
||||
BOOT_DEBUG_PRINT equ 0x901E ;byte If nonzero, duplicates debug output to the screen.
|
||||
BOOT_DMA equ 0x901F ;
|
||||
BOOT_PCI_DATA equ 0x9020 ;8bytes pci data
|
||||
BOOT_VRR equ 0x9030 ;byte VRR start enabled 1, 2-no
|
||||
;BOOT_IDE_BASE_ADDR equ 0x9031 ;word IDEContrRegsBaseAddr ; now free and is not used
|
||||
BOOT_MEM_AMOUNT equ 0x9034 ;dword memory amount
|
||||
|
||||
BOOT_APM_ENTRY equ 0x9040
|
||||
BOOT_APM_VERSION equ 0x9044
|
||||
BOOT_APM_FLAGS equ 0x9046 ;unused
|
||||
BOOT_APM_CODE_32 equ 0x9050
|
||||
BOOT_APM_CODE_16 equ 0x9052
|
||||
BOOT_APM_DATA_16 equ 0x9054
|
||||
;BOOT_IDE_BAR0_16 equ 0x9056 ; now free and is not used
|
||||
;BOOT_IDE_BAR1_16 equ 0x9058 ; now free and is not used
|
||||
;BOOT_IDE_BAR2_16 equ 0x905A ; now free and is not used
|
||||
;BOOT_IDE_BAR3_16 equ 0x905C ; now free and is not used
|
||||
;BOOT_IDE_PI_16 equ 0x905E ; now free and is not used
|
||||
;BOOT_IDE_INTERR_16 equ 0x9060 ; now free and is not used
|
||||
|
||||
TMP_FILE_NAME equ 0
|
||||
TMP_CMD_LINE equ 1024
|
||||
TMP_ICON_OFFS equ 1280
|
||||
|
||||
|
||||
EVENT_REDRAW equ 0x00000001
|
||||
EVENT_KEY equ 0x00000002
|
||||
EVENT_BUTTON equ 0x00000004
|
||||
EVENT_BACKGROUND equ 0x00000010
|
||||
EVENT_MOUSE equ 0x00000020
|
||||
EVENT_IPC equ 0x00000040
|
||||
EVENT_NETWORK equ 0x00000080
|
||||
EVENT_DEBUG equ 0x00000100
|
||||
EVENT_NETWORK2 equ 0x00000200
|
||||
EVENT_EXTENDED equ 0x00000400
|
||||
|
||||
EV_INTR equ 1
|
||||
|
||||
STDIN_FILENO equ 0
|
||||
STDOUT_FILENO equ 1
|
||||
STDERR_FILENO equ 2
|
||||
|
||||
SYSTEM_SHUTDOWN equ 2
|
||||
SYSTEM_REBOOT equ 3
|
||||
SYSTEM_RESTART equ 4
|
||||
|
||||
BLIT_CLIENT_RELATIVE equ 0x20000000
|
||||
|
||||
struct SYSCALL_STACK
|
||||
_eip dd ?
|
||||
_edi dd ? ; +4
|
||||
_esi dd ? ; +8
|
||||
_ebp dd ? ; +12
|
||||
_esp dd ? ; +16
|
||||
_ebx dd ? ; +20
|
||||
_edx dd ? ; +24
|
||||
_ecx dd ? ; +28
|
||||
_eax dd ? ; +32
|
||||
ends
|
||||
|
||||
struct LHEAD
|
||||
next dd ? ;next object in list
|
||||
prev dd ? ;prev object in list
|
||||
ends
|
||||
|
||||
struct MUTEX_WAITER
|
||||
list LHEAD
|
||||
task dd ?
|
||||
type dd ?
|
||||
ends
|
||||
|
||||
struct MUTEX
|
||||
wait_list LHEAD
|
||||
count dd ?
|
||||
ends
|
||||
|
||||
struct RWSEM
|
||||
wait_list LHEAD
|
||||
count dd ?
|
||||
ends
|
||||
|
||||
struct FUTEX
|
||||
list LHEAD
|
||||
magic dd ?
|
||||
handle dd ?
|
||||
destroy dd ?
|
||||
|
||||
wait_list LHEAD
|
||||
pointer dd ?
|
||||
flags dd ?
|
||||
ends
|
||||
|
||||
FUTEX_INIT equ 0
|
||||
FUTEX_DESTROY equ 1
|
||||
FUTEX_WAIT equ 2
|
||||
FUTEX_WAKE equ 3
|
||||
|
||||
struct FILED
|
||||
list LHEAD
|
||||
magic rd 1
|
||||
handle rd 1
|
||||
destroy rd 1
|
||||
mode rd 1
|
||||
file rd 1
|
||||
ends
|
||||
|
||||
struct PIPE
|
||||
pipe_ops rd 1
|
||||
buffer rd 1
|
||||
readers rd 1
|
||||
writers rd 1
|
||||
|
||||
pipe_lock MUTEX
|
||||
count rd 1
|
||||
|
||||
read_end rd 1
|
||||
write_end rd 1
|
||||
rlist LHEAD
|
||||
wlist LHEAD
|
||||
ends
|
||||
|
||||
struct PROC
|
||||
list LHEAD
|
||||
thr_list LHEAD
|
||||
heap_lock MUTEX
|
||||
heap_base rd 1
|
||||
heap_top rd 1
|
||||
mem_used rd 1
|
||||
dlls_list_ptr rd 1
|
||||
pdt_0_phys rd 1
|
||||
pdt_1_phys rd 1
|
||||
io_map_0 rd 1
|
||||
io_map_1 rd 1
|
||||
|
||||
ht_lock rd 1
|
||||
ht_free rd 1 ;htab[0] stdin
|
||||
ht_next rd 1 ;htab[1] stdout
|
||||
htab rd 1024-PROC.htab/4 ;htab[2] stderr
|
||||
pdt_0 rd 1024
|
||||
ends
|
||||
|
||||
struct DBG_REGS
|
||||
dr0 dd ?
|
||||
dr1 dd ?
|
||||
dr2 dd ?
|
||||
dr3 dd ?
|
||||
dr7 dd ?
|
||||
ends
|
||||
|
||||
struct POINT
|
||||
x dd ?
|
||||
y dd ?
|
||||
ends
|
||||
|
||||
struct RECT
|
||||
left dd ?
|
||||
top dd ?
|
||||
right dd ?
|
||||
bottom dd ?
|
||||
ends
|
||||
|
||||
struct BOX
|
||||
left dd ?
|
||||
top dd ?
|
||||
width dd ?
|
||||
height dd ?
|
||||
ends
|
||||
|
||||
struct APPDATA
|
||||
app_name rb 11
|
||||
rb 5
|
||||
|
||||
list LHEAD ;+16
|
||||
process dd ? ;+24
|
||||
fpu_state dd ? ;+28
|
||||
exc_handler dd ? ;+32
|
||||
except_mask dd ? ;+36
|
||||
pl0_stack dd ? ;+40
|
||||
cursor dd ? ;+44
|
||||
fd_ev dd ? ;+48
|
||||
bk_ev dd ? ;+52
|
||||
fd_obj dd ? ;+56
|
||||
bk_obj dd ? ;+60
|
||||
saved_esp dd ? ;+64
|
||||
io_map rd 2 ;+68
|
||||
dbg_state dd ? ;+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
|
||||
ends
|
||||
|
||||
APP_OBJ_OFFSET equ 48
|
||||
APP_EV_OFFSET equ 40
|
||||
|
||||
struct TASKDATA
|
||||
event_mask dd ?
|
||||
pid dd ?
|
||||
dw ?
|
||||
state db ?
|
||||
db ?
|
||||
dw ?
|
||||
wnd_number db ?
|
||||
db ?
|
||||
mem_start dd ?
|
||||
counter_sum dd ?
|
||||
counter_add dd ?
|
||||
cpu_usage dd ?
|
||||
ends
|
||||
|
||||
TSTATE_RUNNING = 0
|
||||
TSTATE_RUN_SUSPENDED = 1
|
||||
TSTATE_WAIT_SUSPENDED = 2
|
||||
TSTATE_ZOMBIE = 3
|
||||
TSTATE_TERMINATING = 4
|
||||
TSTATE_WAITING = 5
|
||||
TSTATE_FREE = 9
|
||||
|
||||
; constants definition
|
||||
WSTATE_NORMAL = 00000000b
|
||||
WSTATE_MAXIMIZED = 00000001b
|
||||
WSTATE_MINIMIZED = 00000010b
|
||||
WSTATE_ROLLEDUP = 00000100b
|
||||
|
||||
WSTATE_REDRAW = 00000001b
|
||||
WSTATE_WNDDRAWN = 00000010b
|
||||
|
||||
WSTYLE_HASCAPTION = 00010000b
|
||||
WSTYLE_CLIENTRELATIVE = 00100000b
|
||||
|
||||
ZPOS_DESKTOP = -2
|
||||
ZPOS_ALWAYS_BACK = -1
|
||||
ZPOS_NORMAL = 0
|
||||
ZPOS_ALWAYS_TOP = 1 ;ZPOS_ALWAYS_TOP is always last and has max number!
|
||||
; structures definition
|
||||
struct WDATA
|
||||
box BOX
|
||||
cl_workarea dd ?
|
||||
cl_titlebar dd ?
|
||||
cl_frames dd ?
|
||||
z_modif db ?
|
||||
fl_wstate db ?
|
||||
fl_wdrawn db ?
|
||||
fl_redraw db ?
|
||||
ends
|
||||
|
||||
label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3
|
||||
|
||||
|
||||
struct SYS_VARS
|
||||
bpp dd ?
|
||||
scanline dd ?
|
||||
vesa_mode dd ?
|
||||
x_res dd ?
|
||||
y_res dd ?
|
||||
ends
|
||||
|
||||
struct APPOBJ ; common object header
|
||||
magic dd ? ;
|
||||
destroy dd ? ; internal destructor
|
||||
fd dd ? ; next object in list
|
||||
bk dd ? ; prev object in list
|
||||
pid dd ? ; owner id
|
||||
ends
|
||||
|
||||
struct CURSOR APPOBJ
|
||||
base dd ? ;allocated memory
|
||||
hot_x dd ? ;hotspot coords
|
||||
hot_y dd ?
|
||||
|
||||
list_next dd ? ;next cursor in cursor list
|
||||
list_prev dd ? ;prev cursor in cursor list
|
||||
dev_obj dd ? ;device depended data
|
||||
ends
|
||||
|
||||
|
||||
struct EVENT APPOBJ
|
||||
id dd ? ;event uid
|
||||
state dd ? ;internal flags
|
||||
code dd ?
|
||||
rd 5
|
||||
ends
|
||||
|
||||
|
||||
struct SMEM
|
||||
bk dd ?
|
||||
fd dd ? ;+4
|
||||
base dd ? ;+8
|
||||
size dd ? ;+12
|
||||
access dd ? ;+16
|
||||
refcount dd ? ;+20
|
||||
name rb 32 ;+24
|
||||
ends
|
||||
|
||||
struct SMAP APPOBJ
|
||||
base dd ? ;mapped base
|
||||
parent dd ? ;SMEM
|
||||
ends
|
||||
|
||||
struct DLLDESCR
|
||||
bk dd ?
|
||||
fd dd ? ;+4
|
||||
data dd ? ;+8
|
||||
size dd ? ;+12
|
||||
timestamp dq ?
|
||||
refcount dd ?
|
||||
defaultbase dd ?
|
||||
coff_hdr dd ?
|
||||
symbols_ptr dd ?
|
||||
symbols_num dd ?
|
||||
symbols_lim dd ?
|
||||
exports dd ? ;export table
|
||||
name rb 260
|
||||
ends
|
||||
|
||||
struct HDLL
|
||||
fd dd ? ;next object in list
|
||||
bk dd ? ;prev object in list
|
||||
pid dd ? ;owner id
|
||||
|
||||
base dd ? ;mapped base
|
||||
size dd ? ;mapped size
|
||||
refcount dd ? ;reference counter for this process and this lib
|
||||
parent dd ? ;DLLDESCR
|
||||
ends
|
||||
|
||||
|
||||
struct BOOT_DATA
|
||||
bpp dd ?
|
||||
scanline dd ?
|
||||
vesa_mode dd ?
|
||||
x_res dd ?
|
||||
y_res dd ?
|
||||
mouse_port dd ?
|
||||
bank_switch dd ?
|
||||
lfb dd ?
|
||||
vesa_mem dd ?
|
||||
log dd ?
|
||||
direct_lfb dd ?
|
||||
pci_data dd ?
|
||||
dd ?
|
||||
vrr dd ?
|
||||
ide_base dd ?
|
||||
mem_amount dd ?
|
||||
pages_count dd ?
|
||||
pagemap_size dd ?
|
||||
kernel_max dd ?
|
||||
kernel_pages dd ?
|
||||
kernel_tables dd ?
|
||||
|
||||
cpu_vendor dd ?
|
||||
dd ?
|
||||
dd ?
|
||||
cpu_sign dd ?
|
||||
cpu_info dd ?
|
||||
cpu_caps dd ?
|
||||
dd ?
|
||||
dd ?
|
||||
ends
|
||||
|
||||
struct display_t
|
||||
x dd ?
|
||||
y dd ?
|
||||
width dd ?
|
||||
height dd ?
|
||||
bits_per_pixel dd ?
|
||||
vrefresh dd ?
|
||||
current_lfb dd ?
|
||||
lfb_pitch dd ?
|
||||
|
||||
win_map_lock RWSEM
|
||||
win_map dd ?
|
||||
win_map_pitch dd ?
|
||||
win_map_size dd ?
|
||||
|
||||
modes dd ?
|
||||
ddev dd ?
|
||||
connector dd ?
|
||||
crtc dd ?
|
||||
|
||||
cr_list.next dd ?
|
||||
cr_list.prev dd ?
|
||||
|
||||
cursor dd ?
|
||||
|
||||
init_cursor dd ?
|
||||
select_cursor dd ?
|
||||
show_cursor dd ?
|
||||
move_cursor dd ?
|
||||
restore_cursor dd ?
|
||||
disable_mouse dd ?
|
||||
mask_seqno dd ?
|
||||
check_mouse dd ?
|
||||
check_m_pixel dd ?
|
||||
|
||||
bytes_per_pixel dd ?
|
||||
ends
|
||||
|
||||
struct DISPMODE
|
||||
width dw ?
|
||||
height dw ?
|
||||
bpp dw ?
|
||||
freq dw ?
|
||||
ends
|
||||
|
||||
|
||||
struct PCIDEV
|
||||
bk dd ?
|
||||
fd dd ?
|
||||
vendor_device_id dd ?
|
||||
class dd ?
|
||||
devfn db ?
|
||||
bus db ?
|
||||
rb 2
|
||||
owner dd ? ; pointer to SRV or 0
|
||||
ends
|
||||
|
||||
struct IDE_DATA
|
||||
ProgrammingInterface dd ?
|
||||
Interrupt dw ?
|
||||
RegsBaseAddres dw ?
|
||||
BAR0_val dw ?
|
||||
BAR1_val dw ?
|
||||
BAR2_val dw ?
|
||||
BAR3_val dw ?
|
||||
dma_hdd_channel_1 db ?
|
||||
dma_hdd_channel_2 db ?
|
||||
pcidev dd ? ; pointer to corresponding PCIDEV structure
|
||||
ends
|
||||
|
||||
struct IDE_CACHE
|
||||
pointer dd ?
|
||||
size dd ? ; not use
|
||||
data_pointer dd ?
|
||||
system_data_size dd ? ; not use
|
||||
appl_data_size dd ? ; not use
|
||||
system_data dd ?
|
||||
appl_data dd ?
|
||||
system_sad_size dd ?
|
||||
appl_sad_size dd ?
|
||||
search_start dd ?
|
||||
appl_search_start dd ?
|
||||
ends
|
||||
|
||||
struct IDE_DEVICE
|
||||
UDMA_possible_modes db ?
|
||||
UDMA_set_mode db ?
|
||||
ends
|
||||
|
||||
; The following macro assume that we are on uniprocessor machine.
|
||||
; Serious work is needed for multiprocessor machines.
|
||||
macro spin_lock_irqsave spinlock
|
||||
{
|
||||
pushf
|
||||
cli
|
||||
}
|
||||
macro spin_unlock_irqrestore spinlock
|
||||
{
|
||||
popf
|
||||
}
|
||||
macro spin_lock_irq spinlock
|
||||
{
|
||||
cli
|
||||
}
|
||||
macro spin_unlock_irq spinlock
|
||||
{
|
||||
sti
|
||||
}
|
||||
|
||||
struct MEM_STATE
|
||||
mutex MUTEX
|
||||
smallmap dd ?
|
||||
treemap dd ?
|
||||
topsize dd ?
|
||||
top dd ?
|
||||
smallbins rd 4*32
|
||||
treebins rd 32
|
||||
ends
|
||||
|
||||
struct PG_DATA
|
||||
mem_amount dd ?
|
||||
vesa_mem dd ?
|
||||
pages_count dd ?
|
||||
pages_free dd ?
|
||||
pages_faults dd ?
|
||||
pagemap_size dd ?
|
||||
kernel_pages dd ?
|
||||
kernel_tables dd ?
|
||||
sys_page_dir dd ?
|
||||
mutex MUTEX
|
||||
ends
|
||||
|
||||
struct SRV
|
||||
srv_name rb 16 ;ASCIIZ string
|
||||
magic dd ? ;+0x10 ;'SRV '
|
||||
size dd ? ;+0x14 ;size of structure SRV
|
||||
fd dd ? ;+0x18 ;next SRV descriptor
|
||||
bk dd ? ;+0x1C ;prev SRV descriptor
|
||||
base dd ? ;+0x20 ;service base address
|
||||
entry dd ? ;+0x24 ;service START function
|
||||
srv_proc dd ? ;+0x28 ;user mode service handler
|
||||
srv_proc_ex dd ? ;+0x2C ;kernel mode service handler
|
||||
ends
|
||||
|
||||
struct USBSRV
|
||||
srv SRV
|
||||
usb_func dd ?
|
||||
ends
|
||||
|
||||
struct USBFUNC
|
||||
strucsize dd ?
|
||||
add_device dd ?
|
||||
device_disconnect dd ?
|
||||
ends
|
||||
|
||||
DRV_ENTRY equ 1
|
||||
DRV_EXIT equ -1
|
||||
|
||||
struct COFF_HEADER
|
||||
machine dw ?
|
||||
nSections dw ?
|
||||
DataTime dd ?
|
||||
pSymTable dd ?
|
||||
nSymbols dd ?
|
||||
optHeader dw ?
|
||||
flags dw ?
|
||||
ends
|
||||
|
||||
struct COFF_SECTION
|
||||
Name rb 8
|
||||
VirtualSize dd ?
|
||||
VirtualAddress dd ?
|
||||
SizeOfRawData dd ?
|
||||
PtrRawData dd ?
|
||||
PtrReloc dd ?
|
||||
PtrLinenumbers dd ?
|
||||
NumReloc dw ?
|
||||
NumLinenum dw ?
|
||||
Characteristics dd ?
|
||||
ends
|
||||
|
||||
struct COFF_RELOC
|
||||
VirtualAddress dd ?
|
||||
SymIndex dd ?
|
||||
Type dw ?
|
||||
ends
|
||||
|
||||
struct COFF_SYM
|
||||
Name rb 8
|
||||
Value dd ?
|
||||
SectionNumber dw ?
|
||||
Type dw ?
|
||||
StorageClass db ?
|
||||
NumAuxSymbols db ?
|
||||
ends
|
||||
|
||||
struct STRIPPED_PE_HEADER
|
||||
Signature dw ?
|
||||
Characteristics dw ?
|
||||
AddressOfEntryPoint dd ?
|
||||
ImageBase dd ?
|
||||
SectionAlignmentLog db ?
|
||||
FileAlignmentLog db ?
|
||||
MajorOSVersion db ?
|
||||
MinorOSVersion db ?
|
||||
SizeOfImage dd ?
|
||||
SizeOfStackReserve dd ?
|
||||
SizeOfHeapReserve dd ?
|
||||
SizeOfHeaders dd ?
|
||||
Subsystem db ?
|
||||
NumberOfRvaAndSizes db ?
|
||||
NumberOfSections dw ?
|
||||
ends
|
||||
STRIPPED_PE_SIGNATURE = 0x4503 ; 'PE' xor 'S'
|
||||
SPE_DIRECTORY_IMPORT = 0
|
||||
SPE_DIRECTORY_EXPORT = 1
|
||||
SPE_DIRECTORY_BASERELOC = 2
|
||||
|
||||
struct IOCTL
|
||||
handle dd ?
|
||||
io_code dd ?
|
||||
input dd ?
|
||||
inp_size dd ?
|
||||
output dd ?
|
||||
out_size dd ?
|
||||
ends
|
||||
|
||||
struct IRQH
|
||||
list LHEAD
|
||||
handler dd ? ;handler roututine
|
||||
data dd ? ;user-specific data
|
||||
num_ints dd ? ;how many times handled
|
||||
ends
|
435
debug-fdo.inc
Normal file
435
debug-fdo.inc
Normal file
@ -0,0 +1,435 @@
|
||||
;
|
||||
; Formatted Debug Output (FDO)
|
||||
; Copyright (c) 2005-2006, mike.dld
|
||||
; Created: 2005-01-29, Changed: 2006-11-10
|
||||
;
|
||||
; For questions and bug reports, mail to mike.dld@gmail.com
|
||||
;
|
||||
; Available format specifiers are: %s, %d, %u, %x (with partial width support)
|
||||
;
|
||||
|
||||
; to be defined:
|
||||
; __DEBUG__ equ 1
|
||||
; __DEBUG_LEVEL__ equ 5
|
||||
|
||||
macro debug_func name {
|
||||
if used name
|
||||
name@of@func equ name
|
||||
}
|
||||
|
||||
macro debug_beginf {
|
||||
align 4
|
||||
name@of@func:
|
||||
}
|
||||
|
||||
debug_endf fix end if
|
||||
|
||||
macro DEBUGS _sign,[_str] {
|
||||
common
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_str \{
|
||||
DEBUGS_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _str \{
|
||||
DEBUGS_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGS_N _sign,_num,[_str] {
|
||||
common
|
||||
pushf
|
||||
pushad
|
||||
local ..str,..label,is_str
|
||||
is_str = 0
|
||||
forward
|
||||
if _str eqtype ''
|
||||
is_str = 1
|
||||
end if
|
||||
common
|
||||
if is_str = 1
|
||||
jmp ..label
|
||||
..str db _str,0
|
||||
..label:
|
||||
add esp,4*8+4
|
||||
mov edx,..str
|
||||
sub esp,4*8+4
|
||||
else
|
||||
mov edx,_str
|
||||
end if
|
||||
if ~_num eq
|
||||
if _num eqtype eax
|
||||
if _num in <eax,ebx,ecx,edx,edi,ebp,esp>
|
||||
mov esi,_num
|
||||
else if ~_num eq esi
|
||||
movzx esi,_num
|
||||
end if
|
||||
else if _num eqtype 0
|
||||
mov esi,_num
|
||||
else
|
||||
local tp
|
||||
tp equ 0
|
||||
match [_arg],_num \{
|
||||
mov esi,dword[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =dword[_arg],tp _num \{
|
||||
mov esi,dword[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =word[_arg],tp _num \{
|
||||
movzx esi,word[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =byte[_arg],tp _num \{
|
||||
movzx esi,byte[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0,tp \{
|
||||
'Error: specified string width is incorrect'
|
||||
\}
|
||||
end if
|
||||
else
|
||||
mov esi,0x7FFFFFFF
|
||||
end if
|
||||
call fdo_debug_outstr
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
macro DEBUGD _sign,_dec {
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_dec \{
|
||||
DEBUGD_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _dec \{
|
||||
DEBUGD_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGD_N _sign,_num,_dec {
|
||||
pushf
|
||||
pushad
|
||||
if (~_num eq)
|
||||
if (_dec eqtype eax | _dec eqtype 0)
|
||||
'Error: precision allowed only for in-memory variables'
|
||||
end if
|
||||
if (~_num in <1,2,4>)
|
||||
if _sign
|
||||
'Error: 1, 2 and 4 are only allowed for precision in %d'
|
||||
else
|
||||
'Error: 1, 2 and 4 are only allowed for precision in %u'
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
if _dec eqtype eax
|
||||
if _dec in <ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
mov eax,_dec
|
||||
else if ~_dec eq eax
|
||||
if _sign = 1
|
||||
movsx eax,_dec
|
||||
else
|
||||
movzx eax,_dec
|
||||
end if
|
||||
end if
|
||||
else if _dec eqtype 0
|
||||
mov eax,_dec
|
||||
else
|
||||
add esp,4*8+4
|
||||
if _num eq
|
||||
mov eax,dword _dec
|
||||
else if _num = 1
|
||||
if _sign = 1
|
||||
movsx eax,byte _dec
|
||||
else
|
||||
movzx eax,byte _dec
|
||||
end if
|
||||
else if _num = 2
|
||||
if _sign = 1
|
||||
movsx eax,word _dec
|
||||
else
|
||||
movzx eax,word _dec
|
||||
end if
|
||||
else
|
||||
mov eax,dword _dec
|
||||
end if
|
||||
sub esp,4*8+4
|
||||
end if
|
||||
mov cl,_sign
|
||||
call fdo_debug_outdec
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
macro DEBUGH _sign,_hex {
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_hex \{
|
||||
DEBUGH_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _hex \{
|
||||
DEBUGH_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGH_N _sign,_num,_hex {
|
||||
pushf
|
||||
pushad
|
||||
if (~_num eq) & (~_num in <1,2,3,4,5,6,7,8>)
|
||||
'Error: 1..8 are only allowed for precision in %x'
|
||||
end if
|
||||
if _hex eqtype eax
|
||||
if _hex in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
if ~_hex eq eax
|
||||
mov eax,_hex
|
||||
end if
|
||||
else if _hex in <ax,bx,cx,dx,si,di,bp,sp>
|
||||
if ~_hex eq ax
|
||||
movzx eax,_hex
|
||||
end if
|
||||
shl eax,16
|
||||
if (_num eq)
|
||||
mov edx,4
|
||||
end if
|
||||
else if _hex in <al,ah,bl,bh,cl,ch,dl,dh>
|
||||
if ~_hex eq al
|
||||
movzx eax,_hex
|
||||
end if
|
||||
shl eax,24
|
||||
if (_num eq)
|
||||
mov edx,2
|
||||
end if
|
||||
end if
|
||||
else if _hex eqtype 0
|
||||
mov eax,_hex
|
||||
else
|
||||
add esp,4*8+4
|
||||
mov eax,dword _hex
|
||||
sub esp,4*8+4
|
||||
end if
|
||||
if ~_num eq
|
||||
mov edx,_num
|
||||
else
|
||||
mov edx,8
|
||||
end if
|
||||
call fdo_debug_outhex
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
debug_func fdo_debug_outchar
|
||||
debug_beginf
|
||||
pushad
|
||||
mov cl,al
|
||||
mov ebx,1
|
||||
mov eax,63
|
||||
; mcall
|
||||
call put_board
|
||||
popad
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outstr
|
||||
debug_beginf
|
||||
mov eax,63
|
||||
mov ebx,1
|
||||
.l1: dec esi
|
||||
js .l2
|
||||
mov cl,[edx]
|
||||
or cl,cl
|
||||
jz .l2
|
||||
; mcall
|
||||
call put_board
|
||||
inc edx
|
||||
jmp .l1
|
||||
.l2: ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outdec
|
||||
debug_beginf
|
||||
or cl,cl
|
||||
jz @f
|
||||
or eax,eax
|
||||
jns @f
|
||||
neg eax
|
||||
push eax
|
||||
mov al,'-'
|
||||
call fdo_debug_outchar
|
||||
pop eax
|
||||
@@: push 10
|
||||
pop ecx
|
||||
push -'0'
|
||||
.l1: xor edx,edx
|
||||
div ecx
|
||||
push edx
|
||||
test eax,eax
|
||||
jnz .l1
|
||||
.l2: pop eax
|
||||
add al,'0'
|
||||
jz .l3
|
||||
call fdo_debug_outchar
|
||||
jmp .l2
|
||||
.l3: ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outhex
|
||||
__fdo_hexdigits db '0123456789ABCDEF'
|
||||
debug_beginf
|
||||
mov cl,dl
|
||||
neg cl
|
||||
add cl,8
|
||||
shl cl,2
|
||||
rol eax,cl
|
||||
.l1: rol eax,4
|
||||
push eax
|
||||
and eax,0x0000000F
|
||||
mov al,[__fdo_hexdigits+eax]
|
||||
call fdo_debug_outchar
|
||||
pop eax
|
||||
dec edx
|
||||
jnz .l1
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
macro DEBUGF _level,_format,[_arg] {
|
||||
common
|
||||
if __DEBUG__ = 1 & _level >= __DEBUG_LEVEL__
|
||||
local ..f1,f2,a1,a2,c1,c2,c3,..lbl
|
||||
_debug_str_ equ __debug_str_ # a1
|
||||
a1 = 0
|
||||
c2 = 0
|
||||
c3 = 0
|
||||
f2 = 0
|
||||
repeat ..lbl-..f1
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
load c1 word from %-1
|
||||
end virtual
|
||||
if c1 = '%s'
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER S,a1,0,_arg
|
||||
else if c1 = '%x'
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER H,a1,0,_arg
|
||||
else if c1 = '%d' | c1 = '%u'
|
||||
local c4
|
||||
if c1 = '%d'
|
||||
c4 = 1
|
||||
else
|
||||
c4 = 0
|
||||
end if
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER D,a1,c4,_arg
|
||||
else if c1 = '\n'
|
||||
c3 = c3 + 1
|
||||
end if
|
||||
end repeat
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if (c1<>0)&(f2<>..lbl-..f1-1)
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
virtual at 0
|
||||
..f1 db _format,0
|
||||
..lbl:
|
||||
__debug_strings equ __debug_strings,_debug_str_,<_format>,..lbl-..f1-1-c2-c3
|
||||
end virtual
|
||||
end if
|
||||
}
|
||||
|
||||
macro DEBUGFG _level, _group, _format, [_arg] {
|
||||
common
|
||||
if _group eqtype
|
||||
DEBUGF _level, _format,_arg
|
||||
else
|
||||
if _level >= _group
|
||||
DEBUGF 999, _format,_arg
|
||||
end if
|
||||
end if
|
||||
}
|
||||
|
||||
macro __include_debug_strings dummy,[_id,_fmt,_len] {
|
||||
common
|
||||
local c1,a1,a2
|
||||
forward
|
||||
if defined _len & ~_len eq
|
||||
_id:
|
||||
a1 = 0
|
||||
a2 = 0
|
||||
repeat _len
|
||||
virtual at 0
|
||||
db _fmt,0,0
|
||||
load c1 word from %+a2-1
|
||||
end virtual
|
||||
if (c1='%s')|(c1='%x')|(c1='%d')|(c1='%u')
|
||||
db 0
|
||||
a2 = a2 + 1
|
||||
else if (c1='\n')
|
||||
dw $0A0D
|
||||
a1 = a1 + 1
|
||||
a2 = a2 + 1
|
||||
else
|
||||
db c1 and 0x0FF
|
||||
end if
|
||||
end repeat
|
||||
db 0
|
||||
end if
|
||||
}
|
||||
|
||||
macro DEBUGF_HELPER _letter,_num,_sign,[_arg] {
|
||||
common
|
||||
local num
|
||||
num = 0
|
||||
forward
|
||||
if num = _num
|
||||
DEBUG#_letter _sign,_arg
|
||||
end if
|
||||
num = num+1
|
||||
common
|
||||
_num = _num+1
|
||||
}
|
||||
|
||||
macro include_debug_strings {
|
||||
if __DEBUG__ = 1
|
||||
match dbg_str,__debug_strings \{
|
||||
__include_debug_strings dbg_str
|
||||
\}
|
||||
end if
|
||||
}
|
203
disk.inc
Normal file
203
disk.inc
Normal file
@ -0,0 +1,203 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2011-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 6917 $
|
||||
|
||||
; =============================================================================
|
||||
; ================================= Constants =================================
|
||||
; =============================================================================
|
||||
; Error codes for callback functions.
|
||||
DISK_STATUS_OK = 0 ; success
|
||||
DISK_STATUS_GENERAL_ERROR = -1; if no other code is suitable
|
||||
DISK_STATUS_INVALID_CALL = 1 ; invalid input parameters
|
||||
DISK_STATUS_NO_MEDIA = 2 ; no media present
|
||||
DISK_STATUS_END_OF_MEDIA = 3 ; end of media while reading/writing data
|
||||
DISK_STATUS_NO_MEMORY = 4 ; insufficient memory for driver operation
|
||||
; Driver flags. Represent bits in DISK.DriverFlags.
|
||||
DISK_NO_INSERT_NOTIFICATION = 1
|
||||
; Media flags. Represent bits in DISKMEDIAINFO.Flags.
|
||||
DISK_MEDIA_READONLY = 1
|
||||
|
||||
; If too many partitions are detected,there is probably an error on the disk.
|
||||
; 256 partitions should be enough for any reasonable use.
|
||||
; Also, the same number is limiting the number of MBRs to process; if
|
||||
; too many MBRs are visible,there probably is a loop in the MBR structure.
|
||||
MAX_NUM_PARTITIONS = 256
|
||||
|
||||
; This structure holds information on a medium.
|
||||
; Objects with this structure are allocated by the kernel as a part of the DISK
|
||||
; structure and are filled by a driver in the 'querymedia' callback.
|
||||
struct DISKMEDIAINFO
|
||||
Flags dd ?
|
||||
; Combination of DISK_MEDIA_* bits.
|
||||
SectorSize dd ?
|
||||
; Size of the sector.
|
||||
Capacity dq ?
|
||||
; Size of the media in sectors.
|
||||
ends
|
||||
|
||||
; This structure represents the disk cache. To follow the old implementation,
|
||||
; there are two distinct caches for a disk, one for "system" data,and the other
|
||||
; for "application" data.
|
||||
struct DISKCACHE
|
||||
; The following fields are inherited from data32.inc:cache_ideX.
|
||||
pointer dd ?
|
||||
data_size dd ? ; unused
|
||||
data dd ?
|
||||
sad_size dd ?
|
||||
search_start dd ?
|
||||
sector_size_log dd ?
|
||||
ends
|
||||
|
||||
; This structure represents a disk device and its media for the kernel.
|
||||
; This structure is allocated by the kernel in the 'disk_add' function,
|
||||
; freed in the 'disk_dereference' function.
|
||||
struct DISK
|
||||
; Fields of disk object
|
||||
Next dd ?
|
||||
Prev dd ?
|
||||
; All disk devices are linked in one list with these two fields.
|
||||
; Head of the list is the 'disk_list' variable.
|
||||
Functions dd ?
|
||||
; Pointer to the 'DISKFUNC' structure with driver functions.
|
||||
Name dd ?
|
||||
; Pointer to the string used for accesses through the global filesystem.
|
||||
UserData dd ?
|
||||
; This field is passed to all callback functions so a driver can decide which
|
||||
; physical device is addressed.
|
||||
DriverFlags dd ?
|
||||
; Bitfield. Currently only DISK_NO_INSERT_NOTIFICATION bit is defined.
|
||||
; If it is set, the driver will never issue 'disk_media_changed' notification
|
||||
; with argument set to true, so the kernel must try to detect media during
|
||||
; requests from the file system.
|
||||
RefCount dd ?
|
||||
; Count of active references to this structure. One reference is kept during
|
||||
; the lifetime of the structure between 'disk_add' and 'disk_del'.
|
||||
; Another reference is taken during any filesystem operation for this disk.
|
||||
; One reference is added if media is inserted.
|
||||
; The structure is destroyed when the reference count decrements to zero:
|
||||
; this usually occurs in 'disk_del', but can be delayed to the end of last
|
||||
; filesystem operation, if one is active.
|
||||
MediaLock MUTEX
|
||||
; Lock to protect the MEDIA structure. See the description after
|
||||
; 'disk_list_mutex' for the locking strategy.
|
||||
; Fields of media object
|
||||
MediaInserted db ?
|
||||
; 0 if media is not inserted, nonzero otherwise.
|
||||
MediaUsed db ?
|
||||
; 0 if media fields are not used, nonzero otherwise. If .MediaRefCount is
|
||||
; nonzero, this field is nonzero too; however, when .MediaRefCount goes
|
||||
; to zero, there is some time interval during which media object is still used.
|
||||
dw ? ; padding
|
||||
; The following fields are not valid unless either .MediaInserted is nonzero
|
||||
; or they are accessed from a code which has obtained the reference when
|
||||
; .MediaInserted was nonzero.
|
||||
MediaRefCount dd ?
|
||||
; Count of active references to the media object. One reference is kept during
|
||||
; the lifetime of the media between two calls to 'disk_media_changed'.
|
||||
; Another reference is taken during any filesystem operation for this media.
|
||||
; The callback 'closemedia' is called when the reference count decrements to
|
||||
; zero: this usually occurs in 'disk_media_changed', but can be delayed to the
|
||||
; end of the last filesystem operation, if one is active.
|
||||
MediaInfo DISKMEDIAINFO
|
||||
; This field keeps information on the current media.
|
||||
NumPartitions dd ?
|
||||
; Number of partitions on this media.
|
||||
Partitions dd ?
|
||||
; Pointer to array of .NumPartitions pointers to PARTITION structures.
|
||||
cache_size dd ?
|
||||
; inherited from cache_ideX_size
|
||||
CacheLock MUTEX
|
||||
; Lock to protect both caches.
|
||||
SysCache DISKCACHE
|
||||
AppCache DISKCACHE
|
||||
; Two caches for the disk.
|
||||
ends
|
||||
|
||||
; This structure represents one partition for the kernel. This is a base
|
||||
; template, the actual contents after common fields is determined by the
|
||||
; file system code for this partition.
|
||||
struct PARTITION
|
||||
FirstSector dq ?
|
||||
; First sector of the partition.
|
||||
Length dq ?
|
||||
; Length of the partition in sectors.
|
||||
Disk dd ?
|
||||
; Pointer to parent DISK structure.
|
||||
FSUserFunctions dd ?
|
||||
; Handlers for the sysfunction 70h. This field is a pointer to the following
|
||||
; array. The first dword is pointer to disconnect handler.
|
||||
; The first dword is a number of supported subfunctions, other dwords
|
||||
; point to handlers of corresponding subfunctions.
|
||||
; ...fs-specific data may follow...
|
||||
ends
|
||||
|
||||
; This is an external structure, it represents an entry in the partition table.
|
||||
struct PARTITION_TABLE_ENTRY
|
||||
Bootable db ?
|
||||
; 80h = bootable partition, 0 = non-bootable partition, other values = invalid
|
||||
FirstHead db ?
|
||||
FirstSector db ?
|
||||
FirstTrack db ?
|
||||
; Coordinates of first sector in CHS.
|
||||
Type db ?
|
||||
; Partition type, one of predefined constants. 0 = empty, several types denote
|
||||
; extended partition (see process_partition_table_entry), we are not interested
|
||||
; in other values.
|
||||
LastHead db ?
|
||||
LastSector db ?
|
||||
LastTrack db ?
|
||||
; Coordinates of last sector in CHS.
|
||||
FirstAbsSector dd ?
|
||||
; Coordinate of first sector in LBA.
|
||||
Length dd ?
|
||||
; Length of the partition in sectors.
|
||||
ends
|
||||
|
||||
; GUID Partition Table Header, UEFI 2.6, Table 18
|
||||
struct GPTH
|
||||
Signature rb 8
|
||||
; 'EFI PART'
|
||||
Revision dd ?
|
||||
; 0x00010000
|
||||
HeaderSize dd ?
|
||||
; Size of this header in bytes, must fit to one sector.
|
||||
HeaderCRC32 dd ?
|
||||
; Set this field to zero, compute CRC32 via 0xEDB88320, compare.
|
||||
Reserved dd ?
|
||||
; Must be zero.
|
||||
MyLBA dq ?
|
||||
; LBA of the sector containing this GPT header.
|
||||
AlternateLBA dq ?
|
||||
; LBA of the sector containing the other GPT header.
|
||||
; AlternateLBA of Primary GPTH points to Backup one and vice versa.
|
||||
FirstUsableLBA dq ?
|
||||
; Only sectors between first and last UsableLBA may form partitions
|
||||
LastUsableLBA dq ?
|
||||
DiskGUID rb 16
|
||||
; Globally Unique IDentifier
|
||||
PartitionEntryLBA dq ?
|
||||
; First LBA of Partition Entry Array.
|
||||
; Length in bytes is computed as a product of two following fields.
|
||||
NumberOfPartitionEntries dd ?
|
||||
; Actual number of partitions depends on the contents of Partition Entry Array.
|
||||
; A partition entry is unused if zeroed.
|
||||
SizeOfPartitionEntry dd ? ; in bytes
|
||||
PartitionEntryArrayCRC32 dd ?
|
||||
; Same CRC as for GPT header.
|
||||
ends
|
||||
|
||||
; GPT Partition Entry, UEFI 2.6, Table 19
|
||||
struct GPE
|
||||
PartitionTypeGUID rb 16
|
||||
UniquePartitionGUID rb 16
|
||||
StartingLBA dq ?
|
||||
EndingLBA dq ?
|
||||
; Length in sectors is EndingLBA - StartingLBA + 1.
|
||||
Attributes dq ?
|
||||
PartitionName rb 72
|
||||
ends
|
441
fdo.inc
Normal file
441
fdo.inc
Normal file
@ -0,0 +1,441 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 5363 $
|
||||
|
||||
_esp equ esp
|
||||
|
||||
;
|
||||
; Formatted Debug Output (FDO)
|
||||
; Copyright (c) 2005-2006, mike.dld
|
||||
; Created: 2005-01-29, Changed: 2006-11-10
|
||||
;
|
||||
; For questions and bug reports, mail to mike.dld@gmail.com
|
||||
;
|
||||
; Available format specifiers are: %s, %d, %u, %x (with partial width support)
|
||||
;
|
||||
|
||||
; to be defined:
|
||||
; __DEBUG__ equ 1
|
||||
; __DEBUG_LEVEL__ equ 5
|
||||
|
||||
macro debug_func name {
|
||||
if used name
|
||||
name@of@func equ name
|
||||
}
|
||||
|
||||
macro debug_beginf {
|
||||
align 4
|
||||
name@of@func:
|
||||
}
|
||||
|
||||
debug_endf fix end if
|
||||
|
||||
macro DEBUGS _sign,[_str] {
|
||||
common
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_str \{
|
||||
DEBUGS_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _str \{
|
||||
DEBUGS_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGS_N _sign,_num,[_str] {
|
||||
common
|
||||
pushf
|
||||
pushad
|
||||
local ..str,..label,is_str
|
||||
is_str = 0
|
||||
forward
|
||||
if _str eqtype ''
|
||||
is_str = 1
|
||||
end if
|
||||
common
|
||||
if is_str = 1
|
||||
jmp ..label
|
||||
..str db _str,0
|
||||
..label:
|
||||
mov edx, ..str
|
||||
else
|
||||
esp equ esp+4*8+4
|
||||
mov edx, _str
|
||||
esp equ _esp
|
||||
end if
|
||||
if ~_num eq
|
||||
if _num eqtype eax
|
||||
if _num in <eax,ebx,ecx,edx,edi,ebp,esp>
|
||||
mov esi, _num
|
||||
else if ~_num eq esi
|
||||
movzx esi, _num
|
||||
end if
|
||||
else if _num eqtype 0
|
||||
mov esi, _num
|
||||
else
|
||||
local tp
|
||||
tp equ 0
|
||||
match [_arg],_num \{
|
||||
mov esi, dword[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =dword[_arg],tp _num \{
|
||||
mov esi, dword[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =word[_arg],tp _num \{
|
||||
movzx esi, word[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 =byte[_arg],tp _num \{
|
||||
movzx esi, byte[_arg]
|
||||
tp equ 1
|
||||
\}
|
||||
match =0,tp \{
|
||||
'Error: specified string width is incorrect'
|
||||
\}
|
||||
end if
|
||||
else
|
||||
mov esi, 0x7FFFFFFF
|
||||
end if
|
||||
call fdo_debug_outstr
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
macro DEBUGD _sign,_dec {
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_dec \{
|
||||
DEBUGD_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _dec \{
|
||||
DEBUGD_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGD_N _sign,_num,_dec {
|
||||
pushf
|
||||
pushad
|
||||
if (~_num eq)
|
||||
if (_dec eqtype eax | _dec eqtype 0)
|
||||
'Error: precision allowed only for in-memory variables'
|
||||
end if
|
||||
if (~_num in <1,2,4>)
|
||||
if _sign
|
||||
'Error: 1, 2 and 4 are only allowed for precision in %d'
|
||||
else
|
||||
'Error: 1, 2 and 4 are only allowed for precision in %u'
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
if _dec eqtype eax
|
||||
if _dec in <ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
mov eax, _dec
|
||||
else if ~_dec eq eax
|
||||
if _sign = 1
|
||||
movsx eax, _dec
|
||||
else
|
||||
movzx eax, _dec
|
||||
end if
|
||||
end if
|
||||
else if _dec eqtype 0
|
||||
mov eax, _dec
|
||||
else
|
||||
; add esp,4*8+4
|
||||
esp equ esp+4*8+4
|
||||
if _num eq
|
||||
mov eax, dword _dec
|
||||
else if _num = 1
|
||||
if _sign = 1
|
||||
movsx eax, byte _dec
|
||||
else
|
||||
movzx eax, byte _dec
|
||||
end if
|
||||
else if _num = 2
|
||||
if _sign = 1
|
||||
movsx eax, word _dec
|
||||
else
|
||||
movzx eax, word _dec
|
||||
end if
|
||||
else
|
||||
mov eax, dword _dec
|
||||
end if
|
||||
esp equ _esp
|
||||
; sub esp,4*8+4
|
||||
end if
|
||||
mov cl, _sign
|
||||
call fdo_debug_outdec
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
macro DEBUGH _sign,_hex {
|
||||
local tp
|
||||
tp equ 0
|
||||
match _arg:_num,_hex \{
|
||||
DEBUGH_N _sign,_num,_arg
|
||||
tp equ 1
|
||||
\}
|
||||
match =0 _arg,tp _hex \{
|
||||
DEBUGH_N _sign,,_arg
|
||||
\}
|
||||
}
|
||||
|
||||
macro DEBUGH_N _sign,_num,_hex {
|
||||
pushf
|
||||
pushad
|
||||
if (~_num eq) & (~_num in <1,2,3,4,5,6,7,8>)
|
||||
'Error: 1..8 are only allowed for precision in %x'
|
||||
end if
|
||||
if _hex eqtype eax
|
||||
if _hex in <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
if ~_hex eq eax
|
||||
mov eax, _hex
|
||||
end if
|
||||
mov edx, 8
|
||||
else if _hex in <ax,bx,cx,dx,si,di,bp,sp>
|
||||
if ~_hex eq ax
|
||||
movzx eax, _hex
|
||||
end if
|
||||
if (_num eq)
|
||||
mov edx, 4
|
||||
end if
|
||||
else if _hex in <al,ah,bl,bh,cl,ch,dl,dh>
|
||||
if ~_hex eq al
|
||||
movzx eax, _hex
|
||||
end if
|
||||
if (_num eq)
|
||||
mov edx, 2
|
||||
end if
|
||||
end if
|
||||
else if _hex eqtype 0
|
||||
mov eax, _hex
|
||||
else
|
||||
; add esp,4*8+4
|
||||
esp equ esp+4*8+4
|
||||
mov eax, dword _hex
|
||||
esp equ _esp
|
||||
; sub esp,4*8+4
|
||||
end if
|
||||
if ~_num eq
|
||||
mov edx, _num
|
||||
else
|
||||
if ~_hex eqtype eax
|
||||
mov edx, 8
|
||||
end if
|
||||
end if
|
||||
call fdo_debug_outhex
|
||||
popad
|
||||
popf
|
||||
}
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
debug_func fdo_debug_outchar
|
||||
debug_beginf
|
||||
pushad
|
||||
movzx ecx, al
|
||||
mov ebx, 1
|
||||
call sys_msg_board
|
||||
popad
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outstr
|
||||
debug_beginf
|
||||
mov ebx, 1
|
||||
.l1:
|
||||
dec esi
|
||||
js .l2
|
||||
movzx ecx, byte[edx]
|
||||
or cl, cl
|
||||
jz .l2
|
||||
call sys_msg_board
|
||||
inc edx
|
||||
jmp .l1
|
||||
.l2:
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outdec
|
||||
debug_beginf
|
||||
or cl, cl
|
||||
jz @f
|
||||
or eax, eax
|
||||
jns @f
|
||||
neg eax
|
||||
push eax
|
||||
mov al, '-'
|
||||
call fdo_debug_outchar
|
||||
pop eax
|
||||
@@:
|
||||
movi ecx, 10
|
||||
push -'0'
|
||||
.l1:
|
||||
xor edx, edx
|
||||
div ecx
|
||||
push edx
|
||||
test eax, eax
|
||||
jnz .l1
|
||||
.l2:
|
||||
pop eax
|
||||
add al, '0'
|
||||
jz .l3
|
||||
call fdo_debug_outchar
|
||||
jmp .l2
|
||||
.l3:
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
debug_func fdo_debug_outhex
|
||||
__fdo_hexdigits db '0123456789ABCDEF'
|
||||
debug_beginf
|
||||
mov cl, dl
|
||||
neg cl
|
||||
add cl, 8
|
||||
shl cl, 2
|
||||
rol eax, cl
|
||||
.l1:
|
||||
rol eax, 4
|
||||
push eax
|
||||
and eax, 0x0000000F
|
||||
mov al, [__fdo_hexdigits+eax]
|
||||
call fdo_debug_outchar
|
||||
pop eax
|
||||
dec edx
|
||||
jnz .l1
|
||||
ret
|
||||
debug_endf
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
macro DEBUGF _level,_format,[_arg] {
|
||||
common
|
||||
if __DEBUG__ = 1 & _level >= __DEBUG_LEVEL__
|
||||
local ..f1,f2,a1,a2,c1,c2,c3,..lbl
|
||||
_debug_str_ equ __debug_str_ # a1
|
||||
a1 = 0
|
||||
c2 = 0
|
||||
c3 = 0
|
||||
f2 = 0
|
||||
repeat ..lbl-..f1
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
load c1 word from %-1
|
||||
end virtual
|
||||
if c1 = '%s'
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER S,a1,0,_arg
|
||||
else if c1 = '%x'
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER H,a1,0,_arg
|
||||
else if c1 = '%d' | c1 = '%u'
|
||||
local c4
|
||||
if c1 = '%d'
|
||||
c4 = 1
|
||||
else
|
||||
c4 = 0
|
||||
end if
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
store word 0 at %-1
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if c1 <> 0
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
c2 = c2 + 1
|
||||
f2 = %+1
|
||||
DEBUGF_HELPER D,a1,c4,_arg
|
||||
else if c1 = '\n'
|
||||
c3 = c3 + 1
|
||||
end if
|
||||
end repeat
|
||||
virtual at 0
|
||||
db _format,0,0
|
||||
load c1 from f2-c2
|
||||
end virtual
|
||||
if (c1<>0)&(f2<>..lbl-..f1-1)
|
||||
DEBUGS 0,_debug_str_+f2-c2
|
||||
end if
|
||||
virtual at 0
|
||||
..f1 db _format,0
|
||||
..lbl:
|
||||
__debug_strings equ __debug_strings,_debug_str_,<_format>,..lbl-..f1-1-c2-c3
|
||||
end virtual
|
||||
end if
|
||||
}
|
||||
|
||||
macro __include_debug_strings dummy,[_id,_fmt,_len] {
|
||||
common
|
||||
local c1,a1,a2
|
||||
forward
|
||||
if defined _len & ~_len eq
|
||||
_id:
|
||||
a1 = 0
|
||||
a2 = 0
|
||||
repeat _len
|
||||
virtual at 0
|
||||
db _fmt,0,0
|
||||
load c1 word from %+a2-1
|
||||
end virtual
|
||||
if (c1='%s')|(c1='%x')|(c1='%d')|(c1='%u')
|
||||
db 0
|
||||
a2 = a2 + 1
|
||||
else if (c1='\n')
|
||||
dw $0A0D
|
||||
a1 = a1 + 1
|
||||
a2 = a2 + 1
|
||||
else
|
||||
db c1 and 0x0FF
|
||||
end if
|
||||
end repeat
|
||||
db 0
|
||||
end if
|
||||
}
|
||||
|
||||
macro DEBUGF_HELPER _letter,_num,_sign,[_arg] {
|
||||
common
|
||||
local num
|
||||
num = 0
|
||||
forward
|
||||
if num = _num
|
||||
DEBUG#_letter _sign,_arg
|
||||
end if
|
||||
num = num+1
|
||||
common
|
||||
_num = _num+1
|
||||
}
|
||||
|
||||
macro include_debug_strings {
|
||||
if __DEBUG__ = 1
|
||||
match dbg_str,__debug_strings \{
|
||||
__include_debug_strings dbg_str
|
||||
\}
|
||||
end if
|
||||
}
|
142
fs_common.inc
Normal file
142
fs_common.inc
Normal file
@ -0,0 +1,142 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 6462 $
|
||||
|
||||
fsReadCMOS:
|
||||
out 70h, al
|
||||
in al, 71h
|
||||
xor ah, ah
|
||||
shl ax, 4
|
||||
shr al, 4
|
||||
aad
|
||||
ret
|
||||
|
||||
fsGetTime:
|
||||
mov al, 7
|
||||
call fsReadCMOS
|
||||
ror eax, 8
|
||||
mov al, 8
|
||||
call fsReadCMOS
|
||||
ror eax, 8
|
||||
mov al, 9
|
||||
call fsReadCMOS
|
||||
add eax, 2000
|
||||
ror eax, 16
|
||||
push eax
|
||||
xor eax, eax
|
||||
call fsReadCMOS
|
||||
ror eax, 8
|
||||
mov al, 2
|
||||
call fsReadCMOS
|
||||
ror eax, 8
|
||||
mov al, 4
|
||||
call fsReadCMOS
|
||||
ror eax, 16
|
||||
push eax
|
||||
mov esi, esp
|
||||
add esp, 8
|
||||
fsCalculateTime:
|
||||
; in: esi -> data block
|
||||
; out: eax = seconds since 01.01.2001
|
||||
movzx eax, word [esi+6]
|
||||
sub eax, 2001
|
||||
jnc @f
|
||||
xor eax, eax
|
||||
@@:
|
||||
mov edx, months
|
||||
mov ebx, eax
|
||||
inc eax
|
||||
test eax, 3
|
||||
jnz @f
|
||||
add edx, 12
|
||||
@@:
|
||||
movzx eax, byte [esi+5]
|
||||
dec eax
|
||||
xor ecx, ecx
|
||||
@@:
|
||||
dec eax
|
||||
js @f
|
||||
add cl, [edx+eax]
|
||||
adc ch, 0
|
||||
jmp @b
|
||||
@@:
|
||||
mov eax, ebx ; years
|
||||
mov edx, 365
|
||||
mul edx
|
||||
shr ebx, 2
|
||||
add eax, ebx
|
||||
add eax, ecx
|
||||
mov bl, [esi+4]
|
||||
dec eax
|
||||
add eax, ebx ; days
|
||||
mov dl, 24
|
||||
mul edx
|
||||
mov bl, [esi+2]
|
||||
add eax, ebx ; hours
|
||||
mov ecx, 60
|
||||
mul ecx
|
||||
mov bl, [esi+1]
|
||||
add eax, ebx ; minutes
|
||||
mul ecx
|
||||
mov bl, [esi]
|
||||
add eax, ebx
|
||||
ret
|
||||
|
||||
;iglobal
|
||||
months db 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
||||
months2 db 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
||||
;endg
|
||||
|
||||
fsTime2bdfe:
|
||||
; in: eax = seconds since 01.01.2001
|
||||
; edi -> data block
|
||||
; out: edi = edi+8
|
||||
xor edx, edx
|
||||
mov ecx, 60
|
||||
div ecx
|
||||
mov [edi], dl
|
||||
xor edx, edx
|
||||
div ecx
|
||||
mov [edi+1], dl
|
||||
xor edx, edx
|
||||
mov cl, 24
|
||||
div ecx
|
||||
mov [edi+2], dx
|
||||
xor edx, edx
|
||||
mov cx, 365
|
||||
div ecx
|
||||
mov ebx, eax
|
||||
add ebx, 2001
|
||||
shr eax, 2
|
||||
sub edx, eax
|
||||
jns @f
|
||||
dec ebx
|
||||
add edx, 365
|
||||
test ebx, 3
|
||||
jnz @f
|
||||
inc edx
|
||||
@@:
|
||||
xor eax, eax
|
||||
mov ecx, months-1
|
||||
test ebx, 3
|
||||
jnz @f
|
||||
add ecx, 12
|
||||
@@:
|
||||
inc ecx
|
||||
inc eax
|
||||
sub dl, [ecx]
|
||||
jnc @b
|
||||
dec dh
|
||||
jns @b
|
||||
add dl, [ecx]
|
||||
inc edx
|
||||
mov [edi+4], dl
|
||||
mov [edi+5], al
|
||||
mov [edi+6], bx
|
||||
add edi, 8
|
||||
ret
|
69
kglobals.inc
Normal file
69
kglobals.inc
Normal file
@ -0,0 +1,69 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 5363 $
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; use "iglobal" for inserting initialized global data definitions.
|
||||
;------------------------------------------------------------------
|
||||
macro iglobal {
|
||||
IGlobals equ IGlobals,
|
||||
macro __IGlobalBlock { }
|
||||
|
||||
macro iglobal_nested {
|
||||
IGlobals equ IGlobals,
|
||||
macro __IGlobalBlock \{ }
|
||||
|
||||
;-------------------------------------------------------------
|
||||
; use 'uglobal' for inserting uninitialized global definitions.
|
||||
; even when you define some data values, these variables
|
||||
; will be stored as uninitialized data.
|
||||
;-------------------------------------------------------------
|
||||
macro uglobal {
|
||||
UGlobals equ UGlobals,
|
||||
macro __UGlobalBlock { }
|
||||
|
||||
macro uglobal_nested {
|
||||
UGlobals equ UGlobals,
|
||||
macro __UGlobalBlock \{ }
|
||||
|
||||
endg fix } ; Use endg for ending iglobal and uglobal blocks.
|
||||
endg_nested fix \}
|
||||
|
||||
macro IncludeIGlobals{
|
||||
macro IGlobals dummy,[n] \{ __IGlobalBlock
|
||||
purge __IGlobalBlock \}
|
||||
match I, IGlobals \{ I \} }
|
||||
|
||||
|
||||
macro IncludeUGlobals{
|
||||
macro UGlobals dummy,[n] \{
|
||||
\common
|
||||
\local begin, size
|
||||
begin = $
|
||||
virtual at $
|
||||
\forward
|
||||
__UGlobalBlock
|
||||
purge __UGlobalBlock
|
||||
\common
|
||||
size = $ - begin
|
||||
end virtual
|
||||
rb size
|
||||
\}
|
||||
match U, UGlobals \{ U \} }
|
||||
|
||||
macro IncludeAllGlobals {
|
||||
IncludeIGlobals
|
||||
IncludeUGlobals
|
||||
}
|
||||
|
||||
iglobal
|
||||
endg
|
||||
|
||||
uglobal
|
||||
endg
|
99
macros.inc
Normal file
99
macros.inc
Normal file
@ -0,0 +1,99 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
__REV = 0
|
||||
|
||||
macro $Revision a {
|
||||
match =: Num =$,a \{
|
||||
if __REV < Num
|
||||
__REV = Num
|
||||
end if
|
||||
\}
|
||||
}
|
||||
|
||||
$Revision: 5788 $
|
||||
|
||||
|
||||
;// mike.dld, 2006-29-01 [
|
||||
|
||||
; macros definition
|
||||
macro diff16 title,l1,l2
|
||||
{
|
||||
local s,d
|
||||
s = l2-l1
|
||||
display title,': 0x'
|
||||
repeat 16
|
||||
d = 48 + s shr ((16-%) shl 2) and $0F
|
||||
if d > 57
|
||||
d = d + 65-57-1
|
||||
end if
|
||||
display d
|
||||
end repeat
|
||||
display 13,10
|
||||
}
|
||||
macro diff10 title,l1,l2
|
||||
{
|
||||
local s,d,z,m
|
||||
s = l2-l1
|
||||
z = 0
|
||||
m = 1000000000
|
||||
display title,': '
|
||||
repeat 10
|
||||
d = '0' + s / m
|
||||
s = s - (s/m)*m
|
||||
m = m / 10
|
||||
if d <> '0'
|
||||
z = 1
|
||||
end if
|
||||
if z <> 0
|
||||
display d
|
||||
end if
|
||||
end repeat
|
||||
display 13,10
|
||||
}
|
||||
|
||||
include 'kglobals.inc'
|
||||
|
||||
; \begin{diamond}[29.09.2006]
|
||||
; may be useful for kernel debugging
|
||||
; example 1:
|
||||
; dbgstr 'Hello, World!'
|
||||
; example 2:
|
||||
; dbgstr 'Hello, World!', save_flags
|
||||
macro dbgstr string*, f
|
||||
{
|
||||
local a
|
||||
iglobal_nested
|
||||
a db 'K : ',string,13,10,0
|
||||
endg_nested
|
||||
if ~ f eq
|
||||
pushfd
|
||||
end if
|
||||
push esi
|
||||
mov esi, a
|
||||
call sys_msg_board_str
|
||||
pop esi
|
||||
if ~ f eq
|
||||
popfd
|
||||
end if
|
||||
}
|
||||
; \end{diamond}[29.09.2006]
|
||||
|
||||
|
||||
; MOV Immediate.
|
||||
; Useful for things like movi eax,10:
|
||||
; shorter than regular mov, but slightly slower,
|
||||
; do not use it in performance-critical places.
|
||||
macro movi dst, imm
|
||||
{
|
||||
if imm >= -0x80 & imm <= 0x7F
|
||||
push imm
|
||||
pop dst
|
||||
else
|
||||
mov dst, imm
|
||||
end if
|
||||
}
|
25
makefile
Normal file
25
makefile
Normal file
@ -0,0 +1,25 @@
|
||||
FASM=fasm
|
||||
|
||||
all: xfskosfuse
|
||||
|
||||
#xfskos: xfskos.o
|
||||
# ld *.o -o $@ -m elf_i386 -nostdlib
|
||||
# strip $@
|
||||
|
||||
xfskos.o: xfskos.asm xfs.inc xfs.asm
|
||||
$(FASM) $< $@
|
||||
|
||||
xfskosfuse: xfskosfuse.o xfskos.o
|
||||
gcc -m32 -Wall $^ -o $@ -D_FILE_OFFSET_BITS=64 -lfuse -g3 -O0
|
||||
|
||||
xfskosfuse.o: xfskosfuse.c
|
||||
gcc -m32 -Wall -c $< -D_FILE_OFFSET_BITS=64 -g3 -O0
|
||||
|
||||
.PHONY: all clean check
|
||||
|
||||
clean:
|
||||
rm -f *.o xfskos
|
||||
|
||||
check: xfskos
|
||||
echo ok
|
||||
|
270
proc32.inc
Normal file
270
proc32.inc
Normal file
@ -0,0 +1,270 @@
|
||||
|
||||
; Macroinstructions for defining and calling procedures
|
||||
|
||||
macro stdcall proc,[arg] ; directly call STDCALL procedure
|
||||
{ common
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
common
|
||||
end if
|
||||
call proc }
|
||||
|
||||
macro invoke proc,[arg] ; indirectly call STDCALL procedure
|
||||
{ common
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
common
|
||||
end if
|
||||
call [proc] }
|
||||
|
||||
macro ccall proc,[arg] ; directly call CDECL procedure
|
||||
{ common
|
||||
size@ccall = 0
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
size@ccall = size@ccall+4
|
||||
common
|
||||
end if
|
||||
call proc
|
||||
if size@ccall
|
||||
add esp,size@ccall
|
||||
end if }
|
||||
|
||||
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
|
||||
{ common
|
||||
size@ccall = 0
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
size@ccall = size@ccall+4
|
||||
common
|
||||
end if
|
||||
call [proc]
|
||||
if size@ccall
|
||||
add esp,size@ccall
|
||||
end if }
|
||||
|
||||
macro proc [args] ; define procedure
|
||||
{ common
|
||||
match name params, args>
|
||||
\{ define@proc name,<params \} }
|
||||
|
||||
prologue@proc equ prologuedef
|
||||
|
||||
macro prologuedef procname,flag,parmbytes,localbytes,reglist
|
||||
{ if parmbytes | localbytes
|
||||
push ebp
|
||||
mov ebp,esp
|
||||
if localbytes
|
||||
sub esp,localbytes
|
||||
end if
|
||||
end if
|
||||
irps reg, reglist \{ push reg \} }
|
||||
|
||||
epilogue@proc equ epiloguedef
|
||||
|
||||
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
|
||||
{ irps reg, reglist \{ reverse pop reg \}
|
||||
if parmbytes | localbytes
|
||||
leave
|
||||
end if
|
||||
if flag and 10000b
|
||||
retn
|
||||
else
|
||||
retn parmbytes
|
||||
end if }
|
||||
|
||||
macro define@proc name,statement
|
||||
{ local params,flag,regs,parmbytes,localbytes,current
|
||||
if used name
|
||||
name:
|
||||
match =stdcall args, statement \{ params equ args
|
||||
flag = 11b \}
|
||||
match =stdcall, statement \{ params equ
|
||||
flag = 11b \}
|
||||
match =c args, statement \{ params equ args
|
||||
flag = 10001b \}
|
||||
match =c, statement \{ params equ
|
||||
flag = 10001b \}
|
||||
match =params, params \{ params equ statement
|
||||
flag = 0 \}
|
||||
virtual at ebp+8
|
||||
match =uses reglist=,args, params \{ regs equ reglist
|
||||
params equ args \}
|
||||
match =regs =uses reglist, regs params \{ regs equ reglist
|
||||
params equ \}
|
||||
match =regs, regs \{ regs equ \}
|
||||
match =,args, params \{ defargs@proc args \}
|
||||
match =args@proc args, args@proc params \{ defargs@proc args \}
|
||||
parmbytes = $ - (ebp+8)
|
||||
end virtual
|
||||
name # % = parmbytes/4
|
||||
all@vars equ
|
||||
current = 0
|
||||
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
|
||||
macro locals
|
||||
\{ virtual at ebp-localbytes+current
|
||||
macro label def \\{ match . type,def> \\\{ deflocal@proc .,label,<type \\\} \\}
|
||||
struc db [val] \\{ \common deflocal@proc .,db,val \\}
|
||||
struc du [val] \\{ \common deflocal@proc .,du,val \\}
|
||||
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
|
||||
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
|
||||
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
|
||||
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
|
||||
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
|
||||
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
|
||||
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
|
||||
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
|
||||
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
|
||||
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
|
||||
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
|
||||
macro endl
|
||||
\{ purge label
|
||||
restruc db,du,dw,dp,dd,dt,dq
|
||||
restruc rb,rw,rp,rd,rt,rq
|
||||
current = $-(ebp-localbytes)
|
||||
end virtual \}
|
||||
macro ret operand
|
||||
\{ match any, operand \\{ retn operand \\}
|
||||
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
|
||||
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
|
||||
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
|
||||
end if \} }
|
||||
|
||||
macro defargs@proc [arg]
|
||||
{ common
|
||||
if ~ arg eq
|
||||
forward
|
||||
local ..arg,current@arg
|
||||
match argname:type, arg
|
||||
\{ current@arg equ argname
|
||||
label ..arg type
|
||||
argname equ ..arg
|
||||
if dqword eq type
|
||||
dd ?,?,?,?
|
||||
else if tbyte eq type
|
||||
dd ?,?,?
|
||||
else if qword eq type | pword eq type
|
||||
dd ?,?
|
||||
else
|
||||
dd ?
|
||||
end if \}
|
||||
match =current@arg,current@arg
|
||||
\{ current@arg equ arg
|
||||
arg equ ..arg
|
||||
..arg dd ? \}
|
||||
common
|
||||
args@proc equ current@arg
|
||||
forward
|
||||
restore current@arg
|
||||
common
|
||||
end if }
|
||||
|
||||
macro deflocal@proc name,def,[val]
|
||||
{ common
|
||||
match vars, all@vars \{ all@vars equ all@vars, \}
|
||||
all@vars equ all@vars name
|
||||
forward
|
||||
local ..var,..tmp
|
||||
match =label,def \{ ..tmp equ \}
|
||||
match tmp,..tmp \{ ..var def val \}
|
||||
match ,..tmp \{ label ..var val \}
|
||||
match =?, val \{ ..tmp equ \}
|
||||
match any =dup (=?), val \{ ..tmp equ \}
|
||||
match tmp : value, ..tmp : val
|
||||
\{ tmp: end virtual
|
||||
initlocal@proc ..var,def value
|
||||
virtual at tmp\}
|
||||
common
|
||||
match first rest, ..var, \{ name equ first \} }
|
||||
|
||||
macro initlocal@proc name,def
|
||||
{ virtual at name
|
||||
def
|
||||
size@initlocal = $ - name
|
||||
end virtual
|
||||
position@initlocal = 0
|
||||
while size@initlocal > position@initlocal
|
||||
virtual at name
|
||||
def
|
||||
if size@initlocal - position@initlocal < 2
|
||||
current@initlocal = 1
|
||||
load byte@initlocal byte from name+position@initlocal
|
||||
else if size@initlocal - position@initlocal < 4
|
||||
current@initlocal = 2
|
||||
load word@initlocal word from name+position@initlocal
|
||||
else
|
||||
current@initlocal = 4
|
||||
load dword@initlocal dword from name+position@initlocal
|
||||
end if
|
||||
end virtual
|
||||
if current@initlocal = 1
|
||||
mov byte [name+position@initlocal],byte@initlocal
|
||||
else if current@initlocal = 2
|
||||
mov word [name+position@initlocal],word@initlocal
|
||||
else
|
||||
mov dword [name+position@initlocal],dword@initlocal
|
||||
end if
|
||||
position@initlocal = position@initlocal + current@initlocal
|
||||
end while }
|
||||
|
||||
macro endp
|
||||
{ purge ret,locals,endl
|
||||
finish@proc
|
||||
purge finish@proc
|
||||
restore regs@proc
|
||||
match all,args@proc \{ restore all \}
|
||||
restore args@proc
|
||||
match all,all@vars \{ restore all \} }
|
||||
|
||||
macro local [var]
|
||||
{ common
|
||||
locals
|
||||
forward done@local equ
|
||||
match varname[count]:vartype, var
|
||||
\{ match =BYTE, vartype \\{ varname rb count
|
||||
restore done@local \\}
|
||||
match =WORD, vartype \\{ varname rw count
|
||||
restore done@local \\}
|
||||
match =DWORD, vartype \\{ varname rd count
|
||||
restore done@local \\}
|
||||
match =PWORD, vartype \\{ varname rp count
|
||||
restore done@local \\}
|
||||
match =QWORD, vartype \\{ varname rq count
|
||||
restore done@local \\}
|
||||
match =TBYTE, vartype \\{ varname rt count
|
||||
restore done@local \\}
|
||||
match =DQWORD, vartype \\{ label varname dqword
|
||||
rq count+count
|
||||
restore done@local \\}
|
||||
match , done@local \\{ virtual
|
||||
varname vartype
|
||||
end virtual
|
||||
rb count*sizeof.\#vartype
|
||||
restore done@local \\} \}
|
||||
match :varname:vartype, done@local:var
|
||||
\{ match =BYTE, vartype \\{ varname db ?
|
||||
restore done@local \\}
|
||||
match =WORD, vartype \\{ varname dw ?
|
||||
restore done@local \\}
|
||||
match =DWORD, vartype \\{ varname dd ?
|
||||
restore done@local \\}
|
||||
match =PWORD, vartype \\{ varname dp ?
|
||||
restore done@local \\}
|
||||
match =QWORD, vartype \\{ varname dq ?
|
||||
restore done@local \\}
|
||||
match =TBYTE, vartype \\{ varname dt ?
|
||||
restore done@local \\}
|
||||
match =DQWORD, vartype \\{ label varname dqword
|
||||
dq ?,?
|
||||
restore done@local \\}
|
||||
match , done@local \\{ varname vartype
|
||||
restore done@local \\} \}
|
||||
match ,done@local
|
||||
\{ var
|
||||
restore done@local \}
|
||||
common
|
||||
endl }
|
180
struct.inc
Normal file
180
struct.inc
Normal file
@ -0,0 +1,180 @@
|
||||
|
||||
; Macroinstructions for defining data structures
|
||||
|
||||
macro struct name
|
||||
{ fields@struct equ name
|
||||
match child parent, name \{ fields@struct equ child,fields@\#parent \}
|
||||
sub@struct equ
|
||||
struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
|
||||
struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
|
||||
struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
|
||||
struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
|
||||
struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
|
||||
struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
|
||||
struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
|
||||
struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
|
||||
struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
|
||||
struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
|
||||
struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
|
||||
struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
|
||||
struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
|
||||
macro db [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,db,<val> \}
|
||||
macro dw [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dw,<val> \}
|
||||
macro du [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,du,<val> \}
|
||||
macro dd [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dd,<val> \}
|
||||
macro dp [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dp,<val> \}
|
||||
macro dq [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dq,<val> \}
|
||||
macro dt [val] \{ \common \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dt,<val> \}
|
||||
macro rb count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,db,count dup (?) \}
|
||||
macro rw count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
|
||||
macro rd count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
|
||||
macro rp count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
|
||||
macro rq count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
|
||||
macro rt count \{ \local anonymous
|
||||
fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
|
||||
macro union \{ fields@struct equ fields@struct,,union,<
|
||||
sub@struct equ union \}
|
||||
macro struct \{ fields@struct equ fields@struct,,substruct,<
|
||||
sub@struct equ substruct \}
|
||||
virtual at 0 }
|
||||
|
||||
macro ends
|
||||
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
|
||||
restruc rb,rw,rd,rp,rq,rt
|
||||
purge db,dw,du,dd,dp,dq,dt
|
||||
purge rb,rw,rd,rp,rq,rt
|
||||
purge union,struct
|
||||
match name=,fields,fields@struct \\{ fields@struct equ
|
||||
make@struct name,fields
|
||||
fields@\\#name equ fields \\}
|
||||
end virtual \}
|
||||
match any, sub@struct \{ fields@struct equ fields@struct> \}
|
||||
restore sub@struct }
|
||||
|
||||
macro make@struct name,[field,type,def]
|
||||
{ common
|
||||
if $
|
||||
display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
|
||||
err
|
||||
end if
|
||||
local define
|
||||
define equ name
|
||||
forward
|
||||
local sub
|
||||
match , field \{ make@substruct type,name,sub def
|
||||
define equ define,.,sub, \}
|
||||
match any, field \{ define equ define,.#field,type,<def> \}
|
||||
common
|
||||
match fields, define \{ define@struct fields \} }
|
||||
|
||||
macro define@struct name,[field,type,def]
|
||||
{ common
|
||||
local list
|
||||
list equ
|
||||
forward
|
||||
if ~ field eq .
|
||||
name#field type def
|
||||
sizeof.#name#field = $ - name#field
|
||||
else
|
||||
rb sizeof.#type
|
||||
end if
|
||||
local value
|
||||
match any, list \{ list equ list, \}
|
||||
list equ list <value>
|
||||
common
|
||||
sizeof.#name = $
|
||||
restruc name
|
||||
match values, list \{
|
||||
struc name value \\{
|
||||
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
|
||||
match , fields@struct \\\{ label .
|
||||
forward
|
||||
match , value \\\\{ field type def \\\\}
|
||||
match any, value \\\\{ field type value
|
||||
if ~ field eq .
|
||||
rb sizeof.#name#field - ($-field)
|
||||
end if \\\\}
|
||||
common \\\} \\} \} }
|
||||
|
||||
macro enable@substruct
|
||||
{ macro make@substruct substruct,parent,name,[field,type,def]
|
||||
\{ \common
|
||||
\local define
|
||||
define equ parent,name
|
||||
\forward
|
||||
\local sub
|
||||
match , field \\{ match any, type \\\{ enable@substruct
|
||||
make@substruct type,name,sub def
|
||||
purge make@substruct
|
||||
define equ define,.,sub, \\\} \\}
|
||||
match any, field \\{ define equ define,.\#field,type,<def> \\}
|
||||
\common
|
||||
match fields, define \\{ define@\#substruct fields \\} \} }
|
||||
|
||||
enable@substruct
|
||||
|
||||
macro define@union parent,name,[field,type,def]
|
||||
{ common
|
||||
virtual at 0
|
||||
forward
|
||||
if ~ field eq .
|
||||
virtual at 0
|
||||
parent#field type def
|
||||
sizeof.#parent#field = $ - parent#field
|
||||
end virtual
|
||||
if sizeof.#parent#field > $
|
||||
rb sizeof.#parent#field - $
|
||||
end if
|
||||
else if sizeof.#type > $
|
||||
rb sizeof.#type - $
|
||||
end if
|
||||
common
|
||||
sizeof.#name = $
|
||||
end virtual
|
||||
struc name [value] \{ \common
|
||||
label .\#name
|
||||
last@union equ
|
||||
forward
|
||||
match any, last@union \\{ virtual at .\#name
|
||||
field type def
|
||||
end virtual \\}
|
||||
match , last@union \\{ match , value \\\{ field type def \\\}
|
||||
match any, value \\\{ field type value \\\} \\}
|
||||
last@union equ field
|
||||
common rb sizeof.#name - ($ - .\#name) \} }
|
||||
|
||||
macro define@substruct parent,name,[field,type,def]
|
||||
{ common
|
||||
virtual at 0
|
||||
forward
|
||||
if ~ field eq .
|
||||
parent#field type def
|
||||
sizeof.#parent#field = $ - parent#field
|
||||
else
|
||||
rb sizeof.#type
|
||||
end if
|
||||
local value
|
||||
common
|
||||
sizeof.#name = $
|
||||
end virtual
|
||||
struc name value \{
|
||||
label .\#name
|
||||
forward
|
||||
match , value \\{ field type def \\}
|
||||
match any, value \\{ field type value
|
||||
if ~ field eq .
|
||||
rb sizeof.#parent#field - ($-field)
|
||||
end if \\}
|
||||
common \} }
|
17
system.inc
Normal file
17
system.inc
Normal file
@ -0,0 +1,17 @@
|
||||
SYS_EXIT = 1
|
||||
SYS_READ = 3
|
||||
SYS_WRITE = 4
|
||||
SYS_OPEN = 5
|
||||
SYS_CLOSE = 6
|
||||
SYS_LSEEK = 19
|
||||
|
||||
SEEK_SET = 0
|
||||
SEEK_CUR = 1
|
||||
SEEK_END = 2
|
||||
|
||||
O_RDONLY = 0
|
||||
O_LARGEFILE = 0x8000
|
||||
|
||||
STDIN = 0
|
||||
STDOUT = 1
|
||||
STDERR = 2
|
529
xfs.inc
Normal file
529
xfs.inc
Normal file
@ -0,0 +1,529 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 5363 $
|
||||
|
||||
|
||||
; from stat.h
|
||||
; distinguish file types
|
||||
S_IFMT = 0170000o ; These bits determine file type.
|
||||
S_IFDIR = 0040000o ; Directory.
|
||||
S_IFCHR = 0020000o ; Character device.
|
||||
S_IFBLK = 0060000o ; Block device.
|
||||
S_IFREG = 0100000o ; Regular file.
|
||||
S_IFIFO = 0010000o ; FIFO.
|
||||
S_IFLNK = 0120000o ; Symbolic link.
|
||||
S_IFSOCK = 0140000o ; Socket.
|
||||
; end stat.h
|
||||
|
||||
|
||||
; XFS null constant: empty fields must be all ones, not zeros!
|
||||
XFS_NULL = -1
|
||||
|
||||
|
||||
; static sector numbers
|
||||
XFS_SECT_SB = 0
|
||||
XFS_SECT_AGF = 1
|
||||
XFS_SECT_AGI = 2
|
||||
XFS_SECT_AGFL = 3
|
||||
|
||||
|
||||
; signatures of file system structures
|
||||
; 'string' numbers are treated by fasm as big endian
|
||||
XFS_SB_MAGIC = 'XFSB'
|
||||
XFS_AGF_MAGIC = 'XAGF'
|
||||
XFS_AGI_MAGIC = 'XAGI'
|
||||
XFS_ABTB_MAGIC = 'ABTB'
|
||||
XFS_ABTC_MAGIC = 'ABTC'
|
||||
XFS_IBT_MAGIC = 'IABT'
|
||||
XFS_DINODE_MAGIC = 'IN'
|
||||
XFS_BMAP_MAGIC = 'BMAP'
|
||||
XFS_DA_NODE_MAGIC = 0xbefe ; these are little endian here
|
||||
XFS_ATTR_LEAF_MAGIC = 0xeefb ; but big endian in docs
|
||||
XFS_DIR2_LEAF1_MAGIC = 0xf1d2 ; pay attention!
|
||||
XFS_DIR2_LEAFN_MAGIC = 0xffd2 ;
|
||||
XFS_DIR2_BLOCK_MAGIC = 'XD2B'
|
||||
XFS_DIR2_DATA_MAGIC = 'XD2D'
|
||||
XFS_DIR2_FREE_MAGIC = 'XD2F'
|
||||
XFS_DQUOT_MAGIC = 'DQ'
|
||||
|
||||
|
||||
; bitfield lengths for packed extent
|
||||
; MSB to LSB / left to right
|
||||
BMBT_EXNTFLAG_BITLEN = 1
|
||||
BMBT_STARTOFF_BITLEN = 54
|
||||
BMBT_STARTBLOCK_BITLEN = 52
|
||||
BMBT_BLOCKCOUNT_BITLEN = 21
|
||||
|
||||
|
||||
; those constants are taken from linux source (xfs_dir2_leaf.h)
|
||||
; they are magic infile offsets for directories
|
||||
XFS_DIR2_DATA_ALIGN_LOG = 3 ; i.e., 8 bytes
|
||||
XFS_DIR2_LEAF_SPACE = 1
|
||||
XFS_DIR2_SPACE_SIZE = 1 SHL (32 + XFS_DIR2_DATA_ALIGN_LOG)
|
||||
XFS_DIR2_LEAF_OFFSET = XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE
|
||||
XFS_DIR2_FREE_SPACE = 2
|
||||
XFS_DIR2_SPACE_SIZE = 1 SHL (32 + XFS_DIR2_DATA_ALIGN_LOG)
|
||||
XFS_DIR2_FREE_OFFSET = XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE
|
||||
|
||||
|
||||
; data section magic constants for directories (xfs_dir2_data.h)
|
||||
XFS_DIR2_DATA_FD_COUNT = 3
|
||||
XFS_DIR2_DATA_FREE_TAG = 0xffff
|
||||
|
||||
|
||||
; valid inode formats
|
||||
; enum xfs_dinode_fmt (xfs_dinode.h)
|
||||
XFS_DINODE_FMT_DEV = 0 ; xfs_dev_t
|
||||
XFS_DINODE_FMT_LOCAL = 1 ; one inode is enough (shortdir)
|
||||
XFS_DINODE_FMT_EXTENTS = 2 ; one or more extents (leafdir, nodedir, regular files)
|
||||
XFS_DINODE_FMT_BTREE = 3 ; highly fragmented files or really huge directories
|
||||
XFS_DINODE_FMT_UUID = 4 ; uuid_t
|
||||
|
||||
|
||||
; size of the unlinked inode hash table in the agi
|
||||
XFS_AGI_UNLINKED_BUCKETS = 64
|
||||
|
||||
|
||||
; possible extent states
|
||||
; enum xfs_exntst_t (xfs_bmap_btree.h)
|
||||
XFS_EXT_NORM = 0
|
||||
XFS_EXT_UNWRITTEN = 1
|
||||
XFS_EXT_DMAPI_OFFLINE = 2
|
||||
XFS_EXT_INVALID = 3
|
||||
|
||||
|
||||
; values for inode core flags / di_flags (xfs_dinode.h)
|
||||
XFS_DIFLAG_REALTIME_BIT = 0 ; file's blocks come from rt area
|
||||
XFS_DIFLAG_PREALLOC_BIT = 1 ; file space has been preallocated
|
||||
XFS_DIFLAG_NEWRTBM_BIT = 2 ; for rtbitmap inode, new format
|
||||
XFS_DIFLAG_IMMUTABLE_BIT = 3 ; inode is immutable
|
||||
XFS_DIFLAG_APPEND_BIT = 4 ; inode is append-only
|
||||
XFS_DIFLAG_SYNC_BIT = 5 ; inode is written synchronously
|
||||
XFS_DIFLAG_NOATIME_BIT = 6 ; do not update atime
|
||||
XFS_DIFLAG_NODUMP_BIT = 7 ; do not dump
|
||||
XFS_DIFLAG_RTINHERIT_BIT = 8 ; create with realtime bit set
|
||||
XFS_DIFLAG_PROJINHERIT_BIT = 9 ; create with parents projid
|
||||
XFS_DIFLAG_NOSYMLINKS_BIT = 10 ; disallow symlink creation
|
||||
XFS_DIFLAG_EXTSIZE_BIT = 11 ; inode extent size allocator hint
|
||||
XFS_DIFLAG_EXTSZINHERIT_BIT = 12 ; inherit inode extent size
|
||||
XFS_DIFLAG_NODEFRAG_BIT = 13 ; do not reorganize/defragment
|
||||
XFS_DIFLAG_FILESTREAM_BIT = 14 ; use filestream allocator
|
||||
XFS_DIFLAG_REALTIME = (1 SHL XFS_DIFLAG_REALTIME_BIT)
|
||||
XFS_DIFLAG_PREALLOC = (1 SHL XFS_DIFLAG_PREALLOC_BIT)
|
||||
XFS_DIFLAG_NEWRTBM = (1 SHL XFS_DIFLAG_NEWRTBM_BIT)
|
||||
XFS_DIFLAG_IMMUTABLE = (1 SHL XFS_DIFLAG_IMMUTABLE_BIT)
|
||||
XFS_DIFLAG_APPEND = (1 SHL XFS_DIFLAG_APPEND_BIT)
|
||||
XFS_DIFLAG_SYNC = (1 SHL XFS_DIFLAG_SYNC_BIT)
|
||||
XFS_DIFLAG_NOATIME = (1 SHL XFS_DIFLAG_NOATIME_BIT)
|
||||
XFS_DIFLAG_NODUMP = (1 SHL XFS_DIFLAG_NODUMP_BIT)
|
||||
XFS_DIFLAG_RTINHERIT = (1 SHL XFS_DIFLAG_RTINHERIT_BIT)
|
||||
XFS_DIFLAG_PROJINHERIT = (1 SHL XFS_DIFLAG_PROJINHERIT_BIT)
|
||||
XFS_DIFLAG_NOSYMLINKS = (1 SHL XFS_DIFLAG_NOSYMLINKS_BIT)
|
||||
XFS_DIFLAG_EXTSIZE = (1 SHL XFS_DIFLAG_EXTSIZE_BIT)
|
||||
XFS_DIFLAG_EXTSZINHERIT = (1 SHL XFS_DIFLAG_EXTSZINHERIT_BIT)
|
||||
XFS_DIFLAG_NODEFRAG = (1 SHL XFS_DIFLAG_NODEFRAG_BIT)
|
||||
XFS_DIFLAG_FILESTREAM = (1 SHL XFS_DIFLAG_FILESTREAM_BIT)
|
||||
|
||||
|
||||
; superblock _ondisk_ structure (xfs_sb.h)
|
||||
; this is _not_ the partition structure
|
||||
; for XFS partition structure see XFS below
|
||||
struct xfs_sb
|
||||
sb_magicnum dd ? ; signature, must be XFS_SB_MAGIC
|
||||
sb_blocksize dd ? ; block is the minimal file system unit, in bytes
|
||||
sb_dblocks dq ? ; number of data blocks
|
||||
sb_rblocks dq ? ; number of realtime blocks (not supported yet!)
|
||||
sb_rextents dq ? ; number of realtime extents (not supported yet!)
|
||||
sb_uuid rb 16 ; file system unique identifier
|
||||
sb_logstart dq ? ; starting block of log (for internal journal; journals on separate devices are not supported!)
|
||||
sb_rootino dq ? ; root inode number
|
||||
sb_rbmino dq ? ; bitmap inode for realtime extents (ignored)
|
||||
sb_rsumino dq ? ; summary inode for rt bitmap (ignored)
|
||||
sb_rextsize dd ? ; realtime extent size, blocks
|
||||
sb_agblocks dd ? ; size of an allocation group (the last one may be smaller!)
|
||||
sb_agcount dd ? ; number of allocation groups
|
||||
sb_rbmblocks dd ? ; number of rt bitmap blocks
|
||||
sb_logblocks dd ? ; number of log blocks
|
||||
sb_versionnum dw ? ; header version == XFS_SB_VERSION
|
||||
sb_sectsize dw ? ; volume sector size in bytes (only 512B sectors are supported)
|
||||
sb_inodesize dw ? ; inode size, bytes
|
||||
sb_inopblock dw ? ; inodes per block
|
||||
sb_fname rb 12 ; inodes per block (aka label)
|
||||
sb_blocklog db ? ; log2 of sb_blocksize
|
||||
sb_sectlog db ? ; log2 of sb_blocksize
|
||||
sb_inodelog db ? ; log2 of sb_inodesize
|
||||
sb_inopblog db ? ; log2 of sb_inopblock
|
||||
sb_agblklog db ? ; log2 of sb_agblocks (rounded up!)
|
||||
sb_rextslog db ? ; log2 of sb_rextents
|
||||
sb_inprogress db ? ; mkfs is in progress, don't mount
|
||||
sb_imax_pct db ? ; max % of fs for inode space
|
||||
; statistics
|
||||
sb_icount dq ? ; allocated inodes
|
||||
sb_ifree dq ? ; free inodes
|
||||
sb_fdblocks dq ? ; free data blocks
|
||||
sb_frextents dq ? ; free realtime extents
|
||||
|
||||
sb_uquotino dq ? ; user quota inode
|
||||
sb_gquotino dq ? ; group quota inode
|
||||
sb_qflags dw ? ; quota flags
|
||||
sb_flags db ? ; misc. flags
|
||||
sb_shared_vn db ? ; shared version number
|
||||
sb_inoalignmt dd ? ; inode chunk alignment, fsblocks
|
||||
sb_unit dd ? ; stripe or raid unit
|
||||
sb_width dd ? ; stripe or raid width
|
||||
sb_dirblklog db ? ; log2 of dir block size (fsbs)
|
||||
sb_logsectlog db ? ; log2 of the log sector size
|
||||
sb_logsectsize dw ? ; sector size for the log, bytes
|
||||
sb_logsunit dd ? ; stripe unit size for the log
|
||||
sb_features2 dd ? ; additional feature bits
|
||||
ends
|
||||
|
||||
|
||||
; allocation group inode (xfs_ag.h)
|
||||
struct xfs_agi
|
||||
agi_magicnum dd ? ; magic number == XFS_AGI_MAGIC
|
||||
agi_versionnum dd ? ; header version == XFS_AGI_VERSION
|
||||
agi_seqno dd ? ; sequence number starting from 0
|
||||
agi_length dd ? ; size in blocks of a.g.
|
||||
agi_count dd ? ; count of allocated inodes
|
||||
agi_root dd ? ; root of inode btree
|
||||
agi_level dd ? ; levels in inode btree
|
||||
agi_freecount dd ? ; number of free inodes
|
||||
agi_newino dd ? ; new inode just allocated
|
||||
agi_dirino dd ? ; last directory inode chunk
|
||||
agi_unlinked rd XFS_AGI_UNLINKED_BUCKETS ; Hash table of inodes which have been unlinked but are still being referenced
|
||||
ends
|
||||
|
||||
|
||||
; superblock structure of b+tree node/leaf (same structure, bb_level matters)
|
||||
struct xfs_btree_sblock
|
||||
bb_magic dd ?
|
||||
bb_level dw ? ; distinguishes nodeds and leaves
|
||||
bb_numrecs dw ?
|
||||
bb_leftsib dd ?
|
||||
bb_rightsib dd ?
|
||||
ends
|
||||
|
||||
|
||||
; record of b+tree inode
|
||||
struct xfs_inobt_rec
|
||||
ir_startino dd ?
|
||||
ir_freecount dd ?
|
||||
ir_free dq ?
|
||||
ends
|
||||
|
||||
|
||||
; structure to store create, access and modification time in inode core
|
||||
struct xfs_timestamp
|
||||
t_sec dd ?
|
||||
t_nsec dd ? ; nanoseconds
|
||||
ends
|
||||
|
||||
|
||||
; inode core structure: basic information about file
|
||||
struct xfs_dinode_core
|
||||
di_magic dw ? ; inode magic = XFS_DINODE_MAGIC
|
||||
di_mode dw ? ; mode and type of file
|
||||
di_version db ? ; inode version
|
||||
di_format db ? ; format of di_c data
|
||||
di_onlink dw ? ; old number of links to file
|
||||
di_uid dd ? ; owner's user id
|
||||
di_gid dd ? ; owner's group id
|
||||
di_nlink dd ? ; number of links to file
|
||||
di_projid dw ? ; owner's project id
|
||||
di_pad rb 8 ; unused, zeroed space
|
||||
di_flushiter dw ? ; incremented on flush
|
||||
di_atime xfs_timestamp ; time last accessed
|
||||
di_mtime xfs_timestamp ; time last modified
|
||||
di_ctime xfs_timestamp ; time created/inode modified
|
||||
di_size dq ? ; number of bytes in file
|
||||
di_nblocks dq ? ; number of direct & btree blocks used
|
||||
di_extsize dd ? ; basic/minimum extent size for file
|
||||
di_nextents dd ? ; number of extents in data fork
|
||||
di_anextents dw ? ; number of extents in attribute fork
|
||||
di_forkoff db ? ; attr fork offs, <<3 for 64b align
|
||||
di_aformat db ? ; format of attr fork's data
|
||||
di_dmevmask dd ? ; DMIG event mask
|
||||
di_dmstate dw ? ; DMIG state info
|
||||
di_flags dw ? ; random flags, XFS_DIFLAG_...
|
||||
di_gen dd ? ; generation number
|
||||
ends
|
||||
|
||||
|
||||
; shortform dir header
|
||||
struct xfs_dir2_sf_hdr
|
||||
count db ? ; the number of directory entries, used only if each inode number fits 4 bytes; zero otherwise
|
||||
i8count db ? ; the number of directory entries, used only when count is zero
|
||||
parent dq ? ; parent inode number: xfs_dir2_inou_t (4 or 8 bytes)
|
||||
ends
|
||||
|
||||
|
||||
; shortform dir entry
|
||||
struct xfs_dir2_sf_entry
|
||||
namelen db ? ; actual name length (ASCII)
|
||||
offset rb 2 ; saved offset
|
||||
name db ? ; name, variable size
|
||||
; inumber dq ? ; xfs_dir2_inou_t
|
||||
ends
|
||||
|
||||
|
||||
; active entry in a data block
|
||||
; aligned to 8 bytes
|
||||
; tag appears as the last 2 bytes
|
||||
struct xfs_dir2_data_entry
|
||||
inumber dq ? ; inode number
|
||||
namelen db ? ; name length
|
||||
name db ? ; name bytes, no null
|
||||
; tag dw ? ; starting offset of us
|
||||
ends
|
||||
|
||||
|
||||
; unused entry in a data block
|
||||
; aligned to 8 bytes
|
||||
; tag appears as the last 2 bytes
|
||||
struct xfs_dir2_data_unused
|
||||
freetag dw ? ; XFS_DIR2_DATA_FREE_TAG
|
||||
length dw ? ; total free length
|
||||
; tag dw ? ; starting offset of us
|
||||
ends
|
||||
|
||||
|
||||
; generic data entry
|
||||
struct xfs_dir2_data_union
|
||||
union
|
||||
xentry xfs_dir2_data_entry
|
||||
unused xfs_dir2_data_unused
|
||||
ends
|
||||
ends
|
||||
|
||||
|
||||
; describe a free area in the data block
|
||||
; the freespace will be formatted as a xfs_dir2_data_unused_t
|
||||
struct xfs_dir2_data_free
|
||||
offset dw ? ; start of freespace
|
||||
length dw ? ; length of freespace
|
||||
ends
|
||||
|
||||
|
||||
; header for the data blocks
|
||||
; always at the beginning of a directory-sized block
|
||||
; the code knows that XFS_DIR2_DATA_FD_COUNT is 3
|
||||
struct xfs_dir2_data_hdr
|
||||
magic dd ? ; XFS_DIR2_DATA_MAGIC or XFS_DIR2_BLOCK_MAGIC
|
||||
bestfree xfs_dir2_data_free
|
||||
bestfree2 xfs_dir2_data_free
|
||||
bestfree3 xfs_dir2_data_free
|
||||
ends
|
||||
|
||||
|
||||
; leaf block entry
|
||||
struct xfs_dir2_leaf_entry
|
||||
hashval dd ? ; hash value of name
|
||||
address dd ? ; address of data entry
|
||||
ends
|
||||
|
||||
|
||||
; the tail of directory block
|
||||
struct xfs_dir2_block_tail
|
||||
count dd ? ; count of leaf entries
|
||||
stale dd ? ; count of stale leaf entries
|
||||
ends
|
||||
|
||||
|
||||
; generic single-block structure, for xfs_db
|
||||
struct xfs_dir2_block
|
||||
hdr xfs_dir2_data_hdr
|
||||
u xfs_dir2_data_union
|
||||
; leaf xfs_dir2_leaf_entry
|
||||
; tail xfs_dir2_block_tail
|
||||
ends
|
||||
|
||||
|
||||
;
|
||||
struct xfs_dir2_data
|
||||
hdr xfs_dir2_data_hdr ; magic XFS_DIR2_DATA_MAGIC
|
||||
u xfs_dir2_data_union
|
||||
ends
|
||||
|
||||
|
||||
;
|
||||
struct xfs_da_blkinfo
|
||||
forw dd ? ; previous block in list
|
||||
back dd ? ; following block in list
|
||||
magic dw ? ; validity check on block
|
||||
pad dw ? ; unused
|
||||
ends
|
||||
|
||||
|
||||
; leaf block header
|
||||
struct xfs_dir2_leaf_hdr
|
||||
info xfs_da_blkinfo ; header for da routines
|
||||
count dw ? ; count of entries
|
||||
stale dw ? ; count of stale entries
|
||||
ends
|
||||
|
||||
|
||||
; leaf block tail
|
||||
struct xfs_dir2_leaf_tail
|
||||
bestcount dd ?
|
||||
ends
|
||||
|
||||
|
||||
; leaf block
|
||||
; bests and tail are at the end of the block for single-leaf only
|
||||
; (magic = XFS_DIR2_LEAF1_MAGIC not XFS_DIR2_LEAFN_MAGIC)
|
||||
struct xfs_dir2_leaf
|
||||
hdr xfs_dir2_leaf_hdr ; leaf header
|
||||
ents xfs_dir2_leaf_entry ; entries
|
||||
; bests dw ? ; best free counts
|
||||
; tail xfs_dir2_leaf_tail ; leaf tail
|
||||
ends
|
||||
|
||||
|
||||
; header of 'free' block part
|
||||
struct xfs_dir2_free_hdr
|
||||
magic dd ? ; XFS_DIR2_FREE_MAGIC
|
||||
firstdb dd ? ; db of first entry
|
||||
nvalid dd ? ; count of valid entries
|
||||
nused dd ? ; count of used entries
|
||||
ends
|
||||
|
||||
|
||||
; 'free' part of directiry block
|
||||
struct xfs_dir2_free
|
||||
hdr xfs_dir2_free_hdr ; block header
|
||||
bests dw ? ; best free counts
|
||||
; unused entries are -1 (XFS_NULL)
|
||||
ends
|
||||
|
||||
|
||||
; b+tree node header
|
||||
struct xfs_da_node_hdr
|
||||
info xfs_da_blkinfo
|
||||
count dw ?
|
||||
level dw ?
|
||||
ends
|
||||
|
||||
|
||||
; b+tree node
|
||||
struct xfs_da_node_entry
|
||||
hashval dd ? ; hash value for this descendant
|
||||
before dd ? ; Btree block before this key
|
||||
ends
|
||||
|
||||
|
||||
;
|
||||
struct xfs_da_intnode
|
||||
hdr xfs_da_node_hdr
|
||||
btree xfs_da_node_entry
|
||||
ends
|
||||
|
||||
|
||||
; packet extent
|
||||
struct xfs_bmbt_rec
|
||||
l0 dq ?
|
||||
l1 dq ?
|
||||
ends
|
||||
|
||||
|
||||
; unpacked extent
|
||||
struct xfs_bmbt_irec
|
||||
br_startoff dq ? ; starting file offset
|
||||
br_startblock dq ? ; starting block number
|
||||
br_blockcount dd ? ; number of blocks
|
||||
br_state dd ? ; extent state
|
||||
ends
|
||||
|
||||
|
||||
; bmap root header, on-disk form only
|
||||
struct xfs_bmdr_block
|
||||
bb_level dw ? ; 0 is a leaf
|
||||
bb_numrecs dw ? ; current number of data records
|
||||
ends
|
||||
|
||||
|
||||
; key structure for non-leaf levels of the tree
|
||||
struct xfs_bmbt_key
|
||||
br_startoff dq ? ; starting file offset
|
||||
ends
|
||||
|
||||
|
||||
sizeof.xfs_bmbt_ptr = 8 ; workaround
|
||||
sizeof.xfs_bmdr_ptr = 8 ; workaround
|
||||
|
||||
|
||||
; long form header: bmap btrees
|
||||
; xfs_btree_lblock is xfs_bmbt_block (xfs_btree.h)
|
||||
struct xfs_bmbt_block
|
||||
bb_magic dd ? ; magic number for block type
|
||||
bb_level dw ? ; 0 is a leaf
|
||||
bb_numrecs dw ? ; current number of data records
|
||||
bb_leftsib dq ? ; left sibling block or NULLDFSBNO
|
||||
bb_rightsib dq ? ; right sibling block or NULLDFSBNO
|
||||
ends
|
||||
|
||||
|
||||
; high level inode structure
|
||||
struct xfs_inode
|
||||
di_core xfs_dinode_core ; main info, aka core
|
||||
di_next_unlinked dd ? ; unlinked but still used inode (if any, XFS_NULL otherwise)
|
||||
di_u db ? ; data fork inode part
|
||||
; di_a db ? ; data attribute
|
||||
ends
|
||||
|
||||
|
||||
; internal data for every XFS partition
|
||||
; this _is_ XFS partition structure
|
||||
; most fields are unpacked or bswap'ed values from the superblock, so see xfs_sb structure above
|
||||
struct XFS PARTITION
|
||||
Lock MUTEX ? ; access mutex
|
||||
blocksize dd ?
|
||||
sectsize dd ?
|
||||
dirblocksize dd ?
|
||||
rootino dq ?
|
||||
cur_block dd ?
|
||||
cur_inode dd ?
|
||||
cur_sect dd ?
|
||||
cur_dirblock dd ?
|
||||
tmp_inode dd ?
|
||||
versionnum dd ?
|
||||
features2 dd ?
|
||||
inodesize dd ?
|
||||
inopblock dd ?
|
||||
blocklog dd ?
|
||||
sectlog dd ?
|
||||
inodelog dd ?
|
||||
inopblog dd ?
|
||||
agblklog dd ?
|
||||
blockmsectlog dd ?
|
||||
inodetoblocklog dd ?
|
||||
dirblklog dd ?
|
||||
sectpblock dd ?
|
||||
agblocks dd ?
|
||||
; helpers, temporary vars, etc
|
||||
agblockmask dq ?
|
||||
extent xfs_bmbt_irec
|
||||
left_extents dd ?
|
||||
left_leaves dd ?
|
||||
bytes_to_read dd ?
|
||||
bytes_read dd ?
|
||||
entries_read dd ?
|
||||
file_offset dq ?
|
||||
max_dirblockaddr dd ?
|
||||
next_block_num dq ?
|
||||
dir2_leaf_offset_blocks dd ?
|
||||
dir2_free_offset_blocks dd ?
|
||||
cur_inode_save dd ?
|
||||
bytes_left_in_file dq ?
|
||||
ro_nextents dd ?
|
||||
bb_ptrs dd ?
|
||||
maxnumrecs dd ?
|
||||
buffer_pos dd ?
|
||||
eof dd ?
|
||||
ends
|
||||
|
416
xfskos.asm
Normal file
416
xfskos.asm
Normal file
@ -0,0 +1,416 @@
|
||||
; lib
|
||||
;
|
||||
; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
format ELF
|
||||
|
||||
__DEBUG__ = 1
|
||||
__DEBUG_LEVEL__ = 2
|
||||
|
||||
include 'proc32.inc'
|
||||
include 'struct.inc'
|
||||
include 'macros.inc'
|
||||
include 'const.inc'
|
||||
include 'system.inc'
|
||||
;include 'fdo.inc'
|
||||
include 'debug-fdo.inc'
|
||||
include 'disk.inc'
|
||||
;include 'fs_lfn.inc'
|
||||
include 'fs_common.inc'
|
||||
|
||||
ERROR_SUCCESS = 0
|
||||
ERROR_DISK_BASE = 1
|
||||
ERROR_UNSUPPORTED_FS = 2
|
||||
ERROR_UNKNOWN_FS = 3
|
||||
ERROR_PARTITION = 4
|
||||
ERROR_FILE_NOT_FOUND = 5
|
||||
ERROR_END_OF_FILE = 6
|
||||
ERROR_MEMORY_POINTER = 7
|
||||
ERROR_DISK_FULL = 8
|
||||
ERROR_FS_FAIL = 9
|
||||
ERROR_ACCESS_DENIED = 10
|
||||
ERROR_DEVICE = 11
|
||||
ERROR_OUT_OF_MEMORY = 12
|
||||
|
||||
|
||||
|
||||
purge section,mov,add,sub
|
||||
section '.text' executable align 16
|
||||
|
||||
|
||||
;public _start
|
||||
_start:
|
||||
|
||||
; pushfd
|
||||
; pop eax
|
||||
; or eax, 1 SHL 18 ; Alignment Check flag
|
||||
; push eax
|
||||
; popfd
|
||||
|
||||
pop eax
|
||||
cmp eax, 2
|
||||
jz .params_ok
|
||||
.few_arguments:
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, msg_few_args
|
||||
mov edx, msg_few_args.size
|
||||
int 0x80
|
||||
jmp .error_quit
|
||||
.params_ok:
|
||||
pop eax
|
||||
pop ebx
|
||||
mov [filename], ebx
|
||||
mov eax, SYS_OPEN
|
||||
mov ecx, O_RDONLY OR O_LARGEFILE
|
||||
int 0x80
|
||||
cmp eax, -2 ; FIXME RETURN VALUE
|
||||
je .file_not_found
|
||||
mov [fd], eax
|
||||
|
||||
mov eax, 0
|
||||
mov ebx, mbr_buffer
|
||||
mov ebp, partition
|
||||
call fs_read32_sys
|
||||
|
||||
mov esi, disk
|
||||
mov [esi + DISK.MediaInfo.SectorSize], 512
|
||||
mov ebp, partition
|
||||
mov [ebp + PARTITION.Disk], esi
|
||||
mov ebx, mbr_buffer
|
||||
call xfs_create_partition
|
||||
test eax, eax
|
||||
jz .not_xfs_partition
|
||||
mov [fs_struct], eax
|
||||
|
||||
.next_cmd:
|
||||
call prompt
|
||||
call read_cmd
|
||||
mov eax, dword[cmd_buf]
|
||||
cmp eax, dword 'exit'
|
||||
jnz @f
|
||||
jmp .quit
|
||||
@@:
|
||||
cmp ax, word 'ls'
|
||||
jnz @f
|
||||
call cmd_ls
|
||||
jmp .next_cmd
|
||||
@@:
|
||||
.unknown:
|
||||
call unknown_command
|
||||
jmp .next_cmd
|
||||
|
||||
.quit:
|
||||
mov eax, SYS_EXIT
|
||||
xor ebx, ebx
|
||||
int 0x80
|
||||
.not_xfs_partition:
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, msg_not_xfs_partition
|
||||
mov edx, msg_not_xfs_partition.size
|
||||
int 0x80
|
||||
jmp .error_quit
|
||||
.file_not_found:
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, msg_file_not_found
|
||||
mov edx, msg_file_not_found.size
|
||||
int 0x80
|
||||
stdcall print_filename, [filename]
|
||||
jmp .error_quit
|
||||
.error_quit:
|
||||
mov eax, SYS_EXIT
|
||||
mov ebx, 1
|
||||
int 0x80
|
||||
|
||||
|
||||
cmd_ls:
|
||||
mov ebp, [fs_struct]
|
||||
mov ebx, sf70_params
|
||||
mov esi, cmd_buf
|
||||
mov edi, esi
|
||||
mov al, ' '
|
||||
mov ecx, 100
|
||||
repnz scasb
|
||||
mov [ebx + 0x14], edi
|
||||
mov eax, edi
|
||||
sub eax, esi
|
||||
push eax
|
||||
mov al, 0x0a
|
||||
repnz scasb
|
||||
mov byte[edi-1], 0
|
||||
call xfs_ReadFolder
|
||||
pop eax
|
||||
|
||||
mov eax, sf70_buffer
|
||||
mov ecx, [eax + 4] ; read bdfes
|
||||
add eax, 0x20 ; skip header
|
||||
.next_bdfe:
|
||||
lea edx, [eax + 0x28]
|
||||
push eax ecx
|
||||
stdcall print_filename, edx
|
||||
pop ecx eax
|
||||
add eax, 304
|
||||
dec ecx
|
||||
jnz .next_bdfe
|
||||
|
||||
ret
|
||||
|
||||
|
||||
public kos_fuse_init
|
||||
kos_fuse_init:
|
||||
push ebx esi edi ebp
|
||||
|
||||
mov eax, [esp + 0x14]
|
||||
mov [fd], eax
|
||||
|
||||
mov eax, 0
|
||||
mov ebx, mbr_buffer
|
||||
mov ebp, partition
|
||||
call fs_read32_sys
|
||||
|
||||
mov esi, disk
|
||||
mov [esi + DISK.MediaInfo.SectorSize], 512
|
||||
mov ebp, partition
|
||||
mov [ebp + PARTITION.Disk], esi
|
||||
mov ebx, mbr_buffer
|
||||
call xfs_create_partition
|
||||
test eax, eax
|
||||
jnz @f
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, msg_not_xfs_partition
|
||||
mov edx, msg_not_xfs_partition.size
|
||||
int 0x80
|
||||
@@:
|
||||
mov [fs_struct], eax
|
||||
|
||||
pop ebp edi esi ebx
|
||||
ret
|
||||
|
||||
;char *hello_readdir(const char *path, off_t offset)
|
||||
public kos_fuse_readdir
|
||||
kos_fuse_readdir:
|
||||
push ebx esi edi ebp
|
||||
|
||||
mov edx, sf70_params
|
||||
mov dword[edx + 0x00], 1
|
||||
mov eax, [esp + 0x18] ; offset
|
||||
mov [edx + 0x04], eax
|
||||
mov dword[edx + 0x08], 1
|
||||
mov dword[edx + 0x0c], 100
|
||||
mov dword[edx + 0x10], sf70_buffer
|
||||
mov eax, [esp + 0x14] ; path
|
||||
inc eax ; skip '/'
|
||||
mov [edx + 0x14], eax
|
||||
|
||||
mov ebp, [fs_struct]
|
||||
mov ebx, sf70_params
|
||||
mov esi, eax
|
||||
push 0
|
||||
call xfs_ReadFolder
|
||||
pop eax
|
||||
|
||||
pop ebp edi esi ebx
|
||||
mov eax, sf70_buffer
|
||||
ret
|
||||
|
||||
|
||||
unknown_command:
|
||||
pushad
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, msg_unknown_command
|
||||
mov edx, msg_unknown_command.size
|
||||
int 0x80
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
prompt:
|
||||
pushad
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
mov ecx, endl_prompt
|
||||
mov edx, 2
|
||||
int 0x80
|
||||
popad
|
||||
ret
|
||||
|
||||
read_cmd:
|
||||
pushad
|
||||
mov eax, SYS_READ
|
||||
mov ebx, STDIN
|
||||
mov ecx, cmd_buf
|
||||
mov edx, 4096
|
||||
int 0x80
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
; in: eax = sector, ebx = buffer, ebp = pointer to PARTITION structure
|
||||
fs_read32_sys:
|
||||
pushad
|
||||
imul ecx, eax, 512
|
||||
add ecx, 2048*512
|
||||
mov eax, SYS_LSEEK
|
||||
mov ebx, [fd]
|
||||
mov edx, SEEK_SET
|
||||
int 0x80
|
||||
;DEBUGF 1, "lseek: %x\n", eax
|
||||
popad
|
||||
|
||||
pushad
|
||||
mov eax, SYS_READ
|
||||
mov ecx, ebx
|
||||
mov ebx, [fd]
|
||||
mov edx, 512
|
||||
int 0x80
|
||||
;DEBUGF 1, "read: %d\n", eax
|
||||
popad
|
||||
|
||||
xor eax, eax
|
||||
|
||||
ret
|
||||
|
||||
|
||||
fs_read32_app:
|
||||
ret
|
||||
|
||||
|
||||
fs_read64_sys:
|
||||
pushad
|
||||
imul ecx, eax, 512
|
||||
add ecx, 2048*512
|
||||
mov eax, SYS_LSEEK
|
||||
mov ebx, [fd]
|
||||
mov edx, SEEK_SET
|
||||
int 0x80
|
||||
;DEBUGF 1, "lseek: %x\n", eax
|
||||
popad
|
||||
|
||||
pushad
|
||||
mov eax, SYS_READ
|
||||
imul edx, ecx, 512
|
||||
mov ecx, ebx
|
||||
mov ebx, [fd]
|
||||
int 0x80
|
||||
;DEBUGF 1, "read: %d\n", eax
|
||||
popad
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
||||
fs_read64_app:
|
||||
ret
|
||||
|
||||
|
||||
malloc:
|
||||
push [alloc_pos]
|
||||
add [alloc_pos], eax
|
||||
pop eax
|
||||
ret
|
||||
|
||||
free:
|
||||
ret
|
||||
|
||||
|
||||
kernel_free:
|
||||
ret
|
||||
|
||||
|
||||
mutex_init:
|
||||
ret
|
||||
|
||||
|
||||
mutex_lock:
|
||||
ret
|
||||
|
||||
|
||||
mutex_unlock:
|
||||
ret
|
||||
|
||||
|
||||
put_board:
|
||||
pushad
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
push ecx
|
||||
mov ecx, esp
|
||||
mov edx, 1
|
||||
int 0x80
|
||||
pop ecx
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
proc print_filename _filename
|
||||
stdcall strlen, [_filename]
|
||||
mov byte[edi - 1], 0x0a
|
||||
inc edx
|
||||
mov ecx, [_filename]
|
||||
mov eax, SYS_WRITE
|
||||
mov ebx, STDOUT
|
||||
int 0x80
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc strlen _str
|
||||
mov edi, [_str]
|
||||
mov ecx, -1
|
||||
xor eax, eax
|
||||
repnz scasb
|
||||
not ecx
|
||||
dec ecx
|
||||
mov edx, ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
include 'xfs.asm'
|
||||
|
||||
|
||||
section '.data' writeable align 16
|
||||
msg_few_args db 'usage: xfskos image [offset]',0x0a
|
||||
msg_few_args.size = $ - msg_few_args
|
||||
msg_file_not_found db 'file not found: '
|
||||
msg_file_not_found.size = $ - msg_file_not_found
|
||||
msg_unknown_command db 'unknown command',0x0a
|
||||
msg_unknown_command.size = $ - msg_unknown_command
|
||||
msg_not_xfs_partition db 'not xfs partition',0x0a
|
||||
msg_not_xfs_partition.size = $ - msg_not_xfs_partition
|
||||
endl_prompt db '> '
|
||||
|
||||
include_debug_strings
|
||||
|
||||
partition_offset dd 2048*512
|
||||
alloc_pos dd alloc_base
|
||||
sf70_params dd 1, 0, 1, 100, sf70_buffer, -1
|
||||
|
||||
|
||||
section '.bss' writeable align 16
|
||||
mbr_buffer rb 4096*3
|
||||
filename rd 1
|
||||
fd rd 1
|
||||
cmd_buf rb 4096
|
||||
partition PARTITION
|
||||
disk DISK
|
||||
alloc_base rb 1024*1024
|
||||
fs_struct rd 1
|
||||
sf70_buffer rb 1024*1024
|
115
xfskosfuse.c
Normal file
115
xfskosfuse.c
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
FUSE: Filesystem in Userspace
|
||||
Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||
|
||||
This program can be distributed under the terms of the GNU GPL.
|
||||
See the file COPYING.
|
||||
|
||||
gcc -Wall hello.c `pkg-config fuse --cflags --libs` -o hello
|
||||
*/
|
||||
|
||||
#define FUSE_USE_VERSION 26
|
||||
|
||||
#include <fuse.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char *kos_fuse_readdir(const char *path, off_t offset);
|
||||
void kos_fuse_init(int fd);
|
||||
|
||||
static const char *hello_str = "Hello World!\n";
|
||||
static const char *hello_path = "/hello";
|
||||
|
||||
static int hello_getattr(const char *path, struct stat *stbuf)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
memset(stbuf, 0, sizeof(struct stat));
|
||||
if (strcmp(path, "/") == 0) {
|
||||
stbuf->st_mode = S_IFDIR | 0755;
|
||||
stbuf->st_nlink = 2;
|
||||
} else if (strcmp(path, hello_path) == 0) {
|
||||
stbuf->st_mode = S_IFREG | 0444;
|
||||
stbuf->st_nlink = 1;
|
||||
stbuf->st_size = strlen(hello_str);
|
||||
} else
|
||||
res = -ENOENT;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
||||
off_t offset, struct fuse_file_info *fi)
|
||||
{
|
||||
(void) offset;
|
||||
(void) fi;
|
||||
|
||||
char *bdfe = kos_fuse_readdir(path, offset);
|
||||
|
||||
// if (strcmp(path, "/") != 0)
|
||||
// return -ENOENT;
|
||||
uint32_t i = *(uint32_t*)(bdfe + 4);
|
||||
// int f = open("/tmp/t", O_RDWR | O_CREAT);
|
||||
// write(f, bdfe, 1000);
|
||||
// write(f, &i, 4);
|
||||
// close(f);
|
||||
bdfe += 0x20;
|
||||
for(; i>0; i--) {
|
||||
filler(buf, bdfe + 0x28, NULL, 0);
|
||||
bdfe += 304;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hello_open(const char *path, struct fuse_file_info *fi)
|
||||
{
|
||||
if (strcmp(path, hello_path) != 0)
|
||||
return -ENOENT;
|
||||
|
||||
if ((fi->flags & 3) != O_RDONLY)
|
||||
return -EACCES;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hello_read(const char *path, char *buf, size_t size, off_t offset,
|
||||
struct fuse_file_info *fi)
|
||||
{
|
||||
size_t len;
|
||||
(void) fi;
|
||||
if(strcmp(path, hello_path) != 0)
|
||||
return -ENOENT;
|
||||
|
||||
len = strlen(hello_str);
|
||||
if (offset < len) {
|
||||
if (offset + size > len)
|
||||
size = len - offset;
|
||||
memcpy(buf, hello_str + offset, size);
|
||||
} else
|
||||
size = 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static struct fuse_operations hello_oper = {
|
||||
.getattr = hello_getattr,
|
||||
.readdir = hello_readdir,
|
||||
.open = hello_open,
|
||||
.read = hello_read,
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int fd = open(argv[2], O_RDONLY);
|
||||
kos_fuse_init(fd);
|
||||
return fuse_main(argc-1, argv, &hello_oper, NULL);
|
||||
}
|
Loading…
Reference in New Issue
Block a user