/kernel/branches/kolibri_pe/const.inc |
---|
326,8 → 326,6 |
BgrDataWidth equ (OS_BASE+0x023BFF8) |
BgrDataHeight equ (OS_BASE+0x023BFFC) |
;display_data equ (OS_BASE+0x023C000) ;1024*1280=0x140000 |
virtual at (OS_BASE+0x023CF80) |
tss TSS |
end virtual |
/kernel/branches/kolibri_pe/core/dll.c |
---|
9,6 → 9,9 |
int __stdcall strncmp(const char *s1, const char *s2, size_t n); |
extern int __stdcall mnt_exec(void *raw, size_t raw_size, char *path, |
char *cmdline, u32_t flags) asm ("mnt_exec"); |
static dll_t core_dll; |
static char* strupr(char *str ) |
27,6 → 30,37 |
return( str ); |
} |
void * memcpy(void * _dest, const void *_src, size_t _n) |
{ |
int d0, d1, d2; |
__asm__ __volatile__( |
"rep ; movsl\n\t" |
"testb $2,%b4\n\t" |
"je 1f\n\t" |
"movsw\n" |
"1:\ttestb $1,%b4\n\t" |
"je 2f\n\t" |
"movsb\n" |
"2:" |
: "=&c" (d0), "=&D" (d1), "=&S" (d2) |
:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src) |
: "memory"); |
return (_dest); |
} |
size_t strlen(const char *str) |
{ |
int d0; |
register int __res; |
__asm__ __volatile__( |
"repne\n\t" |
"scasb\n\t" |
"notl %0\n\t" |
"decl %0" |
:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff)); |
return __res; |
} |
void init_core_dll() |
{ |
PIMAGE_DOS_HEADER dos; |
124,3 → 158,221 |
} |
} |
typedef struct |
{ |
int a_type; |
union |
{ |
long a_val; |
void *a_ptr; |
void (*a_fcn)( ) ; |
}a_un; |
}auxv_t; |
#define AUX_COUNT 0 |
typedef struct |
{ |
int argc; /* always 2 */ |
char *path; /* argv[0] program path */ |
char *cmdline; /* argv[1] command line. May be null */ |
u32_t sep1; /* separator. must be zero */ |
char *env; /* single environment string */ |
u32_t sep2; /* separator. must be zero */ |
auxv_t aux[1]; /* aux. AT_NULL for now */ |
}exec_stack_t; |
addr_t new_app_space(void); |
int __stdcall pe_app_param(char *path, void *raw, addr_t ex_pg_dir, |
addr_t ex_stack_page) asm ("pe_app_param"); |
int sys_exec(char *path, char *cmdline, u32_t flags) |
{ |
addr_t ex_pg_dir; |
addr_t ex_stack_tab; |
addr_t ex_stack_page; |
addr_t ex_pl0_stack; |
exec_stack_t *ex_stack; |
int stack_size; |
char *ex_path; |
char *ex_cmdline = NULL; |
size_t raw_size; |
u32_t *raw; |
int pathsize = 0; |
int cmdsize = 0; |
int envsize = 0; |
u32_t tmp; |
DBG("\nexec %s cmd %s flags %x\n", path, cmdline, flags); |
if( ! path) |
{ |
DBG("invalid path\n"); |
return; |
}; |
raw = load_file(path, &raw_size); |
if( ! raw ) |
return -5; /* FIXME */ |
if( (raw[0] == 0x554E454D) && |
( ( raw[1] == 0x31305445) || |
( raw[1] == 0x30305445) ) ) |
{ |
DBG("leagacy Kolibri application\n"); |
int tmp = mnt_exec(raw, raw_size, path, cmdline, flags); |
return tmp; |
} |
if( ! validate_pe(raw, raw_size) ) |
{ |
DBG("invalid executable file %s\n", path); |
mem_free(raw); |
return -31; |
} |
pathsize = strlen(path)+1; |
if( cmdline ) |
cmdsize = strlen(cmdline)+1; |
stack_size = sizeof(exec_stack_t) + pathsize + |
cmdsize + envsize + AUX_COUNT*sizeof(auxv_t); |
stack_size = (stack_size + 15) & ~15; /* keep stack aligned */ |
DBG("stacksize %d\n", stack_size); |
if( stack_size > 4096 ) |
{ |
DBG("command line too long\n"); |
return -30; |
} |
ex_pg_dir = new_app_space(); |
if( !ex_pg_dir ) |
{ |
mem_free(raw); |
return -30; /* FIXME */ |
}; |
ex_stack_tab = ex_pg_dir + 4096; |
ex_pl0_stack = ex_pg_dir + 4096 * 2; |
ex_stack_page = core_alloc(0); /* 2^0 = 1 page */ |
if( ! ex_stack_page ) |
{ |
core_free(ex_stack_tab); |
mem_free(raw); |
return -30; /* FIXME */ |
}; |
__asm__ __volatile__ ( |
"xorl %%eax, %%eax \n\t" |
"rep stosl" |
:"=c"(tmp),"=D"(tmp) |
:"c"(1024),"D"(ex_stack_page + OS_BASE) |
:"eax","cc"); |
((u32_t*)(ex_stack_tab+OS_BASE))[1023] = ex_stack_page | 7; |
ex_stack = (exec_stack_t*)(ex_stack_page + OS_BASE |
+ PAGE_SIZE - stack_size); |
ex_stack->argc = 2; |
ex_path = MakePtr(char*, ex_stack, sizeof(exec_stack_t)+AUX_COUNT*sizeof(auxv_t)); |
memcpy(ex_path, path, pathsize); |
ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FCFF000); /* top of stack */ |
if( cmdline ) |
{ |
ex_cmdline = ex_path + pathsize; |
memcpy(ex_cmdline, cmdline, cmdsize); |
ex_stack->cmdline = ex_stack->path + pathsize; |
}; |
/* |
ex_stack.env = null |
ex_stack.aux[0] = AT_NULL |
*/ |
DBG("create stack at %x\n\tpath %x\n\tcmdline %x\n", |
ex_stack, ex_stack->path, ex_stack->cmdline); |
pe_app_param(path, raw, ex_pg_dir, ex_stack_page); |
return 0; |
}; |
#define master_tab (page_tabs+ (page_tabs>>10)) |
void sys_app_entry(addr_t raw, addr_t ex_stack) |
{ |
PIMAGE_DOS_HEADER dos; |
PIMAGE_NT_HEADERS32 nt; |
size_t img_size; |
count_t img_pages; |
count_t img_tabs; |
count_t i; |
u32_t tmp; |
__asm__ __volatile__ ("sti"); |
DBG("pe_app_entry: raw %x esp %x\n", raw, ex_stack); |
dos = (PIMAGE_DOS_HEADER)raw; |
nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
img_size = nt->OptionalHeader.SizeOfImage; |
img_pages = img_size >> 12; |
img_tabs = ((img_size + 0x3FFFFF) & ~0x3FFFFF) >> 22; |
DBG("app pages %d app tabs %d\n", img_pages, img_tabs); |
for(i = 0; i < img_tabs; i++) |
{ |
addr_t tab = core_alloc(0); |
((u32_t*)master_tab)[i] = tab|7; /* FIXME */ |
} |
((u32_t*)master_tab)[0x7FC/4] = (ex_stack & 0xFFFFF000)|7; /* FIXME */ |
__asm__ __volatile__ ( |
"xorl %%eax, %%eax \n\t" |
"rep stosl" |
:"=c"(tmp),"=D"(tmp) |
:"c"(img_tabs<<10),"D"(page_tabs) |
:"eax","cc"); |
for(i = 0; i < img_pages; i++) |
{ |
addr_t page = core_alloc(0); |
((u32_t*)page_tabs)[i] = page | 7; /* FIXME */ |
} |
create_image(0, raw); |
__asm__ __volatile__ ( |
"xchgw %bx, %bx"); |
addr_t entry = nt->OptionalHeader.AddressOfEntryPoint + |
nt->OptionalHeader.ImageBase; |
// __asm__ __volatile__ ( |
// "call %0":: "r" (entry)); |
while(1); |
}; |
/kernel/branches/kolibri_pe/core/memory.inc |
---|
368,12 → 368,19 |
align 4 |
_GetPgAddr: |
get_pg_addr: |
cmp eax, OS_BASE |
jae @F |
shr eax, 12 |
mov eax, [page_tabs+eax*4] |
and eax, 0xFFFFF000 |
ret |
@@: |
sub eax, OS_BASE |
and eax, 0xFFFFF000 |
ret |
align 4 |
proc page_fault_handler |
/kernel/branches/kolibri_pe/core/taskman.inc |
---|
7,8 → 7,11 |
$Revision$ |
EFL_IF equ 0x0200 |
EFL_IOPL1 equ 0x1000 |
EFL_IOPL2 equ 0x2000 |
EFL_IOPL3 equ 0x3000 |
GREEDY_KERNEL equ 0 |
struc APP_HEADER_00 |
{ .banner dq ? |
46,31 → 49,79 |
rep stosd |
} |
fs_execute_from_sysdir: |
xor ebx, ebx |
xor edx, edx |
mov esi, sysdir_path |
align 4 |
proc fs_execute |
test_app_header: |
virtual at eax |
APP_HEADER_00 APP_HEADER_00 |
end virtual |
virtual at eax |
APP_HEADER_01 APP_HEADER_01 |
end virtual |
;fn_read:dword, file_size:dword, cluster:dword |
cmp dword [eax], 'MENU' |
jne .fail |
cmp word [eax+4],'ET' |
jne .fail |
; ebx - cmdline |
; edx - flags |
; ebp - full filename |
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it |
cmp [eax+6], word '00' |
jne .check_01_header |
mov ecx,[APP_HEADER_00.start] |
mov [ebx+0x08], ecx ;app_eip |
mov edx,[APP_HEADER_00.mem_size] |
mov [ebx+0x10], edx ;app_mem |
shr edx,1 |
sub edx,0x10 |
mov [ebx+0x0C], edx ;app_esp |
mov ecx,[APP_HEADER_00.i_param] |
mov [ebx], ecx ;app_cmdline |
mov [ebx+4], dword 0 ;app_path |
mov edx, [APP_HEADER_00.i_end] |
mov [ebx+0x14], edx |
ret |
.check_01_header: |
cmp [eax+6],word '01' |
jne .fail |
mov ecx,[APP_HEADER_01.start] |
mov [ebx+0x08], ecx ;app_eip |
mov edx,[APP_HEADER_01.mem_size] |
; \begin{diamond}[20.08.2006] |
; sanity check (functions 19,58 load app_i_end bytes and that must |
; fit in allocated memory to prevent kernel faults) |
cmp edx,[APP_HEADER_01.i_end] |
jb .fail |
; \end{diamond}[20.08.2006] |
mov [ebx+0x10], edx ;app_mem |
mov ecx,[APP_HEADER_01.stack_top] |
mov [ebx+0x0C], ecx ;app_esp |
mov edx,[APP_HEADER_01.i_param] |
mov [ebx], edx ;app_cmdline |
mov ecx,[APP_HEADER_01.i_icon] |
mov [ebx+4], ecx ;app_path |
mov edx, [APP_HEADER_01.i_end] |
mov [ebx+0x14], edx |
ret |
.fail: |
xor eax, eax |
ret |
proc mnt_exec stdcall file_base:dword, file_size:dword, \ |
path:dword, cmd_line:dword, flags:dword |
locals |
cmdline rd 64 ;256/4 |
filename rd 256 ;1024/4 |
flags dd ? |
cmdline rb 256 |
filename rb 1024 |
save_cr3 dd ? |
slot dd ? |
slot_base dd ? |
file_base dd ? |
file_size dd ? |
;app header data |
hdr_cmdline dd ? ;0x00 |
hdr_path dd ? ;0x04 |
80,16 → 131,13 |
hdr_i_end dd ? ;0x14 |
endl |
pushad |
push ebx |
push edi |
push esi |
mov [flags], edx |
; [ebp] pointer to filename |
mov esi, [path] |
lea edi, [filename] |
lea ecx, [edi+1024] |
mov al, '/' |
stosb |
@@: |
cmp edi, ecx |
jae .bigfilename |
97,41 → 145,26 |
stosb |
test al, al |
jnz @b |
mov esi, [ebp] |
mov esi, [cmd_line] |
test esi, esi |
jz .namecopied |
mov byte [edi-1], '/' |
jz .no_cmdline |
lea edi, [cmdline] |
lea ecx, [edi+255] |
mov [edi+252], dword 0 |
@@: |
cmp edi, ecx |
jae .bigfilename |
jae .no_cmdline |
lodsb |
stosb |
test al, al |
jnz @b |
jmp .namecopied |
.bigfilename: |
popad |
mov eax, -ERROR_FILE_NOT_FOUND |
ret |
.namecopied: |
mov [cmdline], ebx |
test ebx, ebx |
jz @F |
.no_cmdline: |
lea eax, [cmdline] |
mov dword [eax+252], 0 |
stdcall strncpy, eax, ebx, 255 |
@@: |
lea eax, [filename] |
stdcall load_file, eax |
mov ecx, -ERROR_FILE_NOT_FOUND |
test eax, eax |
jz .err_file |
mov [file_base], eax |
mov [file_size], ebx |
mov eax, [file_base] |
lea ebx, [hdr_cmdline] |
call test_app_header |
mov ecx, -0x1F |
140,18 → 173,9 |
DEBUGF 1,"%s",new_process_loading |
.wait_lock: |
cmp [application_table_status],0 |
je .get_lock |
call change_task |
jmp .wait_lock |
lea ebx, [application_table_status] |
call wait_mutex |
.get_lock: |
mov eax, 1 |
xchg eax, [application_table_status] |
cmp eax, 0 |
jne .wait_lock |
call set_application_table_status |
call get_new_process_place |
222,10 → 246,21 |
mov eax, [save_cr3] |
call set_cr3 |
xor ebx, ebx |
mov [application_table_status],ebx ;unlock application_table_status mutex |
mov [application_table_status], 0 ;unlock application_table_status mutex |
mov eax,[process_number] ;set result |
pop edi |
pop esi |
pop ebx |
ret |
.bigfilename: |
pop edi |
pop esi |
pop ebx |
mov eax, -ERROR_FILE_NOT_FOUND |
ret |
.failed: |
mov eax, [save_cr3] |
call set_cr3 |
233,7 → 268,11 |
.err_hdr: |
mov ecx, [file_base] |
call @mem_free@4 |
.err_file: |
pop edi |
pop esi |
pop ebx |
xor eax, eax |
mov [application_table_status],eax |
mov eax, ecx |
241,66 → 280,163 |
endp |
align 4 |
test_app_header: |
virtual at eax |
APP_HEADER_00 APP_HEADER_00 |
end virtual |
virtual at eax |
APP_HEADER_01 APP_HEADER_01 |
end virtual |
proc pe_app_param stdcall path:dword, raw:dword, ex_pg_dir:dword, ex_stack_page:dword |
cmp dword [eax], 'MENU' |
jne .fail |
cmp word [eax+4],'ET' |
jne .fail |
locals |
slot dd ? |
slot_base dd ? |
endl |
cmp [eax+6], word '00' |
jne .check_01_header |
push ebx |
push esi |
push edi |
mov ecx,[APP_HEADER_00.start] |
mov [ebx+0x08], ecx ;app_eip |
mov edx,[APP_HEADER_00.mem_size] |
mov [ebx+0x10], edx ;app_mem |
shr edx,1 |
sub edx,0x10 |
mov [ebx+0x0C], edx ;app_esp |
mov ecx,[APP_HEADER_00.i_param] |
mov [ebx], ecx ;app_cmdline |
mov [ebx+4], dword 0 ;app_path |
mov edx, [APP_HEADER_00.i_end] |
mov [ebx+0x14], edx |
ret |
lea ebx, [application_table_status] |
call wait_mutex |
.check_01_header: |
call set_application_table_status |
cmp [eax+6],word '01' |
jne .fail |
call get_new_process_place |
test eax, eax |
mov ecx, -0x20 ; too many processes |
jz .err |
mov ecx,[APP_HEADER_01.start] |
mov [ebx+0x08], ecx ;app_eip |
mov edx,[APP_HEADER_01.mem_size] |
mov [slot], eax |
shl eax, 8 |
add eax, SLOT_BASE |
mov [slot_base], eax |
mov edi, eax |
_clear_ 256 ;clean extended information about process |
; \begin{diamond}[20.08.2006] |
; sanity check (functions 19,58 load app_i_end bytes and that must |
; fit in allocated memory to prevent kernel faults) |
cmp edx,[APP_HEADER_01.i_end] |
jb .fail |
; \end{diamond}[20.08.2006] |
; write application name |
lea eax, [path] |
stdcall strrchr, eax, '/' ; now eax points to name without path |
lea esi, [eax+1] |
test eax, eax |
jnz @F |
lea esi, [path] |
@@: |
mov ecx, 8 ; 8 chars for name |
mov edi, [slot_base] |
.copy_process_name_loop: |
lodsb |
cmp al, '.' |
jz .copy_process_name_done |
test al, al |
jz .copy_process_name_done |
stosb |
loop .copy_process_name_loop |
.copy_process_name_done: |
mov [ebx+0x10], edx ;app_mem |
mov ecx,[APP_HEADER_01.stack_top] |
mov [ebx+0x0C], ecx ;app_esp |
mov edx,[APP_HEADER_01.i_param] |
mov [ebx], edx ;app_cmdline |
mov ecx,[APP_HEADER_01.i_icon] |
mov [ebx+4], ecx ;app_path |
mov edx, [APP_HEADER_01.i_end] |
mov [ebx+0x14], edx |
mov eax, [ex_pg_dir] |
mov ebx, [slot_base] |
mov [ebx+APPDATA.dir_table],eax |
;mov eax,[hdr_mem] |
;mov [ebx+APPDATA.mem_size],eax |
lea edi, [eax+OS_BASE+8192] |
mov [ebx+APPDATA.pl0_stack], edi |
add edi, RING0_STACK_SIZE |
mov [ebx+APPDATA.saved_esp0], edi |
mov [ebx+APPDATA.fpu_state], edi |
mov [ebx+APPDATA.fpu_handler], 0 |
mov [ebx+APPDATA.sse_handler], 0 |
;set default io permission map |
mov [ebx+APPDATA.io_map],\ |
(tss._io_map_0-OS_BASE+PG_MAP) |
mov [ebx+APPDATA.io_map+4],\ |
(tss._io_map_1-OS_BASE+PG_MAP) |
mov esi, fpu_data |
mov ecx, 512/4 |
rep movsd |
mov eax, [slot] |
cmp eax,[TASK_COUNT] |
jle .noinc |
inc dword [TASK_COUNT] ;update number of processes |
.noinc: |
lea edx, [ebx+APP_EV_OFFSET] |
mov [ebx+APPDATA.fd_ev],edx |
mov [ebx+APPDATA.bk_ev],edx |
add edx, APP_OBJ_OFFSET-APP_EV_OFFSET |
mov [ebx+APPDATA.fd_obj],edx |
mov [ebx+APPDATA.bk_obj],edx |
mov ecx, [def_cursor] |
mov [ebx+APPDATA.cursor],ecx |
xor ecx, ecx |
call @core_alloc@4 |
add eax, OS_BASE ;FIXME |
mov esi,[current_slot] |
mov esi,[esi+APPDATA.cur_dir] |
mov ecx,0x1000/4 |
mov edi,eax |
mov [ebx+APPDATA.cur_dir],eax |
rep movsd |
mov ebx, [slot] |
mov eax, ebx |
shl ebx, 5 |
mov dword [CURRENT_TASK+ebx+0x10], 0 |
lea ecx,[draw_data+ebx] ;ecx - pointer to draw data |
; set window state to 'normal' (non-minimized/maximized/rolled-up) state |
mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL |
mov [ebx+window_data+WDATA.fl_redraw], 1 |
add ebx,CURRENT_TASK ;ebx - pointer to information about process |
mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot |
mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) |
inc dword [process_number] |
mov eax,[process_number] |
mov [ebx+4],eax ;set PID |
;set draw data to full screen |
mov [ecx+0],dword 0 |
mov [ecx+4],dword 0 |
mov eax,[Screen_Max_X] |
mov [ecx+8],eax |
mov eax,[Screen_Max_Y] |
mov [ecx+12],eax |
mov ebx, [ex_pg_dir] |
add ebx, OS_BASE+8192-16 |
mov [ebx], dword _sys_app_entry |
mov eax, [raw] |
mov edx, [ex_stack_page] |
mov [ebx+8], eax |
mov [ebx+12], edx |
mov ecx, [slot] |
shl ecx, 5 |
mov [ecx*8+SLOT_BASE+APPDATA.saved_esp], ebx |
xor ebx, ebx ; process state - running |
mov [CURRENT_TASK+ecx+TASKDATA.state], bl |
; DEBUGF 1,"%s",new_process_running |
.err: |
mov [application_table_status], 0 ;unlock application_table_status mutex |
mov eax,[process_number] ;set result |
pop edi |
pop esi |
pop ebx |
ret |
.fail: |
xor eax, eax |
ret |
endp |
align 4 |
proc get_new_process_place |
;input: |
455,6 → 591,44 |
endp |
align 4 |
_new_app_space: |
mov ecx, 2 |
call @core_alloc@4 |
test eax, eax |
jz .fail |
push esi |
push edi |
mov edx, eax |
mov ecx, 512 |
lea edi, [eax + OS_BASE] |
xor eax, eax |
cld |
rep stosd |
mov ecx, 512 |
mov esi, _sys_pdbr+(HEAP_BASE shr 20) |
rep movsd |
lea eax, [edx+PG_SW] |
mov [edx+OS_BASE+(page_tabs shr 20)], eax |
add eax, 4096 |
mov [edx+OS_BASE+0x7FC], eax |
lea edi, [edx+OS_BASE+8192] |
mov ecx, 2048 |
xor eax, eax |
rep stosd |
mov eax, edx |
.fail: |
pop edi |
pop esi |
ret |
align 4 |
set_cr3: |
mov ebx, [current_slot] |
917,10 → 1091,6 |
pop eax |
ret |
EFL_IF equ 0x0200 |
EFL_IOPL1 equ 0x1000 |
EFL_IOPL2 equ 0x2000 |
EFL_IOPL3 equ 0x3000 |
align 4 |
/kernel/branches/kolibri_pe/core/v86.inc |
---|
49,11 → 49,12 |
; first half (0x800 bytes) is page table for addresses 0 - 0x100000, |
; second half is for V86-to-linear translation. |
; Third and fourth are for I/O permission map. |
mov ecx, 2 |
call @core_alloc@4 |
mov ecx, 0x4000 |
mov edx, PG_SW |
call @mem_alloc@8 |
test eax, eax |
jz .fail2 |
add eax, OS_BASE |
mov [ebx+V86_machine.pagedir], eax |
push edi eax |
mov edi, eax |
72,14 → 73,14 |
mov edi, eax |
add eax, 1000h |
push eax |
sub eax, OS_BASE |
call get_pg_addr |
or al, PG_UW |
stosd |
; ...and also copy system page tables |
; thx to Serge, system is located at high addresses |
add edi, (OS_BASE shr 20) - 4 |
add edi, (HEAP_BASE shr 20) - 4 |
push esi |
mov esi, (OS_BASE shr 20) + _sys_pdbr |
mov esi, (HEAP_BASE shr 20) + _sys_pdbr |
mov ecx, 0x80000000 shr 22 |
rep movsd |
110,6 → 111,7 |
mov [edi+800h], eax |
lea eax, [edx + 111b] |
stosd |
add edx, 0x1000 |
loop @b |
pop eax |
pop edi |
145,8 → 147,7 |
push eax |
mov ecx, [eax+V86_machine.pagedir] |
sub ecx, OS_BASE |
call @core_free@4 |
call @mem_free@4 |
pop eax |
jmp free |
300,10 → 301,10 |
push dword [ecx+APPDATA.io_map] |
push dword [ecx+APPDATA.io_map+4] |
mov dword [ecx+APPDATA.io_map], eax |
mov dword [page_tabs + (tss._io_map_0 shr 10)], eax |
; mov dword [page_tabs + (tss._io_map_0 shr 10)], eax |
add eax, 0x1000 |
mov dword [ecx+APPDATA.io_map+4], eax |
mov dword [page_tabs + (tss._io_map_1 shr 10)], eax |
; mov dword [page_tabs + (tss._io_map_1 shr 10)], eax |
push [ecx+APPDATA.dir_table] |
push [ecx+APPDATA.saved_esp0] |
820,10 → 821,10 |
mov [SLOT_BASE+ecx+APPDATA.dir_table], eax |
pop ebx |
mov dword [SLOT_BASE+ecx+APPDATA.io_map+4], ebx |
mov dword [page_tabs + (tss._io_map_1 shr 10)], ebx |
; mov dword [page_tabs + (tss._io_map_1 shr 10)], ebx |
pop ebx |
mov dword [SLOT_BASE+ecx+APPDATA.io_map], ebx |
mov dword [page_tabs + (tss._io_map_0 shr 10)], ebx |
; mov dword [page_tabs + (tss._io_map_0 shr 10)], ebx |
mov cr3, eax |
; mov [irq_tab+5*4], 0 |
sti |
/kernel/branches/kolibri_pe/fs/fs_lfn.inc |
---|
104,6 → 104,9 |
; 8 : delete file |
; 9 : create directory |
cmp dword [eax], 7 |
je .do_exec |
; parse file name |
xchg ebx, eax |
lea esi, [ebx+20] |
129,14 → 132,6 |
jz .rootdir |
call process_replace_file_name |
.parse_normal: |
cmp dword [ebx], 7 |
jne @F |
mov edx, [ebx+4] |
mov ebx, [ebx+8] |
call fs_execute ; esi+ebp, ebx, edx |
mov [image_of_eax], eax |
ret |
@@: |
mov edi, rootdirs-8 |
xor ecx, ecx |
push esi |
425,6 → 420,23 |
; esi points to ASCIIZ string - rest of name |
jmp dword [edi] |
.do_exec: |
lea ebx, [eax+20] |
cmp byte [ebx],0 |
jnz @F |
mov ebx, [ebx+1] |
@@: |
push dword [eax+4] |
push dword [eax+8] |
push ebx |
call _sys_exec |
mov [image_of_eax], eax |
add esp, 12 |
ret |
; handlers for devices |
; in: ecx = 0 => query virtual directory /xxx |
; in: ecx = partition number |
/kernel/branches/kolibri_pe/fs/ntfs.inc |
---|
140,8 → 140,8 |
mov edx, PG_SW |
call @mem_alloc@8 |
test eax, eax |
jz problem_fat_dec_count |
mov [ntfs_data.frs_buffer], eax |
jz problem_fat_dec_count |
add eax, [ntfs_data.frs_size] |
mov [ntfs_data.iab_buffer], eax |
; read $MFT disposition |
229,8 → 229,8 |
mov edx, PG_SW |
call @mem_alloc@8 |
test eax, eax |
jz .fail_free_mft |
mov [ntfs_data.cur_index_buf], eax |
jz .fail_free_mft |
popad |
call free_hd_channel |
/kernel/branches/kolibri_pe/include/core.h |
---|
3,6 → 3,11 |
#define IMAGE_BASE 0xE0100000 |
#define LOAD_BASE 0x00100000 |
#define page_tabs 0xDF800000 |
void printf (const char *format, ...); |
#define CALLER ((addr_t) __builtin_return_address(0)) |
/kernel/branches/kolibri_pe/kernel.asm |
---|
131,6 → 131,11 |
public _load_file@4 |
public mnt_exec |
public _new_app_space |
public pe_app_param |
public _strncmp@12 |
public _LoadFile ; stdcall export |
193,7 → 198,9 |
@mem_alloc@8 equ _MemAlloc |
@mem_free@4 equ _MemFree |
extrn @load_pe@4 |
extrn _sys_exec |
;extrn @load_pe@4 |
extrn @load_pe_driver@4 |
extrn _slab_cache_init |
203,6 → 210,7 |
extrn _bx_from_load |
extrn _sys_app_entry |
section '.flat' code readable align 4096 |
374,7 → 382,7 |
;Add IO access table - bit array of permitted ports |
mov edi, tss._io_map_0 |
xor eax, eax |
not eax |
; not eax |
mov ecx, 8192/4 |
rep stosd ; access to 4096*8=65536 ports |
888,7 → 896,7 |
;protect io permission map |
mov esi, [default_io_map] |
; mov esi, [default_io_map] |
; stdcall map_page,esi,(tss._io_map_0-OS_BASE), PG_MAP |
; add esi, 0x1000 |
; stdcall map_page,esi,(tss._io_map_1-OS_BASE), PG_MAP |
907,8 → 915,11 |
; LOAD FIRST APPLICATION |
mov ebp, firstapp |
call fs_execute_from_sysdir |
push 0 |
push 0 |
push read_firstapp |
call _sys_exec |
add esp, 12 |
cmp eax,2 ; continue if a process has been loaded |
je first_app_found |
3459,7 → 3470,7 |
ret |
iglobal |
cpustring db 'CPU',0 |
cpustring db '/sys/CPU',0 |
endg |
uglobal |
3474,8 → 3485,11 |
cmp [ctrl_alt_del], 1 |
jne nocpustart |
mov ebp, cpustring |
call fs_execute_from_sysdir |
push 0 |
push 0 |
push cpustring |
call _sys_exec |
add esp, 12 |
mov [ctrl_alt_del], 0 |