1)new memory layout

2)Infinity 1.0

git-svn-id: svn://kolibrios.org@378 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-02-27 11:47:52 +00:00
parent 02bcaaab53
commit 73c568fb03
16 changed files with 1581 additions and 796 deletions

View File

@ -59,19 +59,19 @@ os_data_l:
db 0x00
app_code_l:
dw 0xFFFF;((0x80000000-std_application_base_address) shr 12) and 0xffff
dw 0xFFFF
dw 0
db 0x40
db 0
db cpl3
dw G32+D32+0x6000+0x7;
dw G32+D32+0x8000+0x7;
app_data_l:
dw 0xFFFF;(0x80000000-std_application_base_address) shr 12 and 0xffff
dw 0xFFFF
dw 0
db 0x40
db 0
db drw3
dw G32+D32+0x6000+0x7;
dw G32+D32+0x8000+0x7;
; --------------- APM ---------------------
apm_code_32:
dw 0x0f ; limit 64kb

View File

@ -85,7 +85,7 @@ CAPS_CMP_LEG equ 72 ;
CAPS_SVM equ 73 ;secure virual machine
CAPS_ALTMOVCR8 equ 74 ;
; CPU MSR names
; CPU MSR names
MSR_SYSENTER_CS equ 0x174
MSR_SYSENTER_ESP equ 0x175
MSR_SYSENTER_EIP equ 0x176
@ -231,30 +231,32 @@ resendQ equ OS_BASE+0x0770000
;skin_data equ OS_BASE+0x0778000
tss_data equ 0x780000
draw_data equ 0x988000
HEAP_BASE equ 0x98B000
page_tabs equ 0x60000000
master_tab equ 0x60180000
current_pgdir equ 0x60180000
LFB_BASE equ 0x7DC00000
sys_pgdir equ OS_BASE+0x00050000
sys_master_tab equ OS_BASE+0x00051000
sys_pgmap equ OS_BASE+0x00052000
page_tabs equ 0x7FC00000
master_tab equ 0x7FDFF000
app_page_tabs equ 0x7FE00000
sys_pgdir equ OS_BASE+0x00050000
sys_master_tab equ OS_BASE+0x00051000
sys_pgmap equ OS_BASE+0x00052000
new_app_base equ 0x60400000
new_app_base equ 0x80000000
twdw equ (CURRENT_TASK-window_data)
std_application_base_address equ new_app_base
RING0_STACK_SIZE equ 0x2000 - 512 ;512 áàéò äëÿ êîíòåêñòà FPU
RING0_STACK_SIZE equ 0x2000 - 512 ;512 áàéò äëÿ êîíòåêñòà FPU
PAGES_USED equ 4
;PAGES_USED equ 4
PG_UNMAP equ 0x000
PG_MAP equ 0x001
@ -445,11 +447,11 @@ struc PG_DATA
}
;struc LIB
;{ .lib_name rb 16
; .lib_base dd ?
; .lib_start dd ?
; .export dd ?
; .import dd ?
;{ .lib_name rb 16
; .lib_base dd ?
; .lib_start dd ?
; .export dd ?
; .import dd ?
;}
struc SRV

View File

@ -1,8 +1,8 @@
DRV_ENTRY equ 1
DRV_EXIT equ -1
DRV_COMPAT equ 3 ;minimal required drivers version
DRV_CURRENT equ 3 ;current drivers model version
DRV_COMPAT equ 4 ;minimal required drivers version
DRV_CURRENT equ 4 ;current drivers model version
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT

View File

@ -36,41 +36,95 @@ init_fpu:
fnsave [fpu_data]
ret
; param
; eax= 512 bytes memory area
align 4
proc fpu_save
fpu_save:
push ecx
push esi
push edi
pushfd
cli
clts
mov ebx, [fpu_owner]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
mov ebx, [CURRENT_TASK]
mov [fpu_owner], ebx
mov edi, eax
mov ecx, [fpu_owner]
mov eax, [CURRENT_TASK]
cmp ecx, eax
jne .save
.copy:
shl eax, 8
mov esi, [eax+PROC_BASE+APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
fninit
popfd
pop edi
pop esi
pop ecx
ret
.save:
mov [fpu_owner], eax
shl ecx, 8
mov ecx, [ecx+PROC_BASE+APPDATA.fpu_state]
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
fxsave [eax]
fninit ;re-init fpu
ret
fxsave [ecx]
jmp .copy
.no_SSE:
fnsave [eax]
ret
endp
fnsave [ecx]
jmp .copy
align 4
proc fpu_restore
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov eax, [ebx+PROC_BASE+0x10]
fpu_restore:
push ecx
push esi
mov esi, eax
pushfd
cli
mov ecx, [fpu_owner]
mov eax, [CURRENT_TASK]
cmp ecx, eax
jne .copy
clts
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
fxrstor [eax]
fxrstor [esi]
popfd
pop esi
pop ecx
ret
.no_SSE:
fnclex ;fix possible problems
frstor [eax]
frstor [esi]
popfd
pop esi
pop ecx
ret
.copy:
shl eax, 8
mov edi, [eax+PROC_BASE+APPDATA.fpu_state]
mov ecx, 512/4
cld
rep movsd
popfd
pop esi
pop ecx
ret
endp
align 4
e7: ;#NM exception handler

View File

@ -106,7 +106,7 @@ proc init_mem
dec ecx
jnz .map_kernel_tabs
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
mov dword [sys_pgdir+(page_tabs shr 20)], sys_pgdir+PG_SW
ret
endp
@ -365,7 +365,7 @@ proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
mov eax, [phis_addr]
and eax, not 0xFFF
or eax, PG_UW ;+PG_NOCACHE
mov dword [current_pgdir+ebx*4], eax
mov dword [master_tab+ebx*4], eax
mov eax, [lin_addr]
shr eax, 10
add eax, page_tabs
@ -376,6 +376,10 @@ endp
align 4
proc init_LFB
locals
pg_count dd ?
endl
cmp dword [LFBAddress], -1
jne @f
mov [0x2f0000+0x901c],byte 2
@ -388,18 +392,9 @@ proc init_LFB
mov [0x2f0000+0x901c],byte 2
ret
@@:
call map_LFB
ret
endp
align 4
proc map_LFB
locals
pg_count dd ?
endl
mov edi, [LFBSize]
mov edx, LFB_BASE
mov esi, [LFBAddress]
mov edi, [LFBSize]
mov dword [exp_lfb+4], esi
shr edi, 12
@ -408,13 +403,12 @@ proc map_LFB
bt [cpu_caps], CAPS_PSE
jnc .map_page_tables
mov ebx, esi
or esi, PG_LARGE+PG_UW
shr ebx, 20
mov ecx, ebx
shr edx, 20
mov ecx, edx
@@:
mov [sys_pgdir+ebx], esi
add ebx, 4
mov [sys_pgdir+edx], esi
add edx, 4
add esi, 0x00400000
dec edi
jnz @B
@ -423,6 +417,7 @@ proc map_LFB
jnc @F
or dword [sys_pgdir+ecx], PG_GLOBAL
@@:
mov dword [LFBAddress], LFB_BASE
mov eax, cr3 ;flush TLB
mov cr3, eax
ret
@ -431,31 +426,19 @@ proc map_LFB
@@:
call alloc_page
stdcall map_page_table, esi, eax
stdcall map_page_table, edx, eax
add esi, 0x00400000
dec edi
jnz @B
mov eax, [LFBAddress]
mov esi, eax
shr esi, 10
add esi, page_tabs
mov edi, page_tabs + (LFB_BASE shr 10)
or eax, PG_UW
mov ecx, [pg_count]
shr ecx, 2
.map:
mov [esi], eax
add eax, 0x1000
mov [esi+4], eax
add eax, 0x1000
mov [esi+8], eax
add eax, 0x1000
mov [esi+12], eax
add eax, 0x1000
add esi, 16
sub ecx, 1
jnz .map
cld
rep stosd
mov dword [LFBAddress], LFB_BASE
mov eax, cr3 ;flush TLB
mov cr3, eax
@ -488,10 +471,10 @@ proc new_mem_resize stdcall, new_size:dword
shr edi, 12
shr esi, 12
@@:
mov eax, [page_tabs+0x00181000+edi*4]
mov eax, [app_page_tabs+edi*4]
test eax, 1
jz .next
mov dword [page_tabs+0x00181000+edi*4], 2
mov dword [app_page_tabs+edi*4], 2
mov ebx, edi
shl ebx, 12
invlpg [ebx+std_application_base_address]
@ -636,18 +619,18 @@ proc page_fault_handler
mov ebx, [ebp-4]
cmp ebx, 0xe0000000
jae .lfb_addr
cmp ebx, 0x60400000
cmp ebx, 0x80000000
jae .user_space
cmp ebx, master_tab+0x1000
cmp ebx, app_page_tabs
jae .alloc
cmp ebx, 0x60000000
cmp ebx, page_tabs
jae .tab_space
cmp ebx, 0x7DC00000
jae .lfb_addr
jmp .kernel_space
.user_space:
@ -1075,7 +1058,7 @@ new_services:
@@:
cmp eax, 17
ja @f
stdcall srv_handlerEx, ebx
call srv_handlerEx ;ebx
mov [esp+36], eax
ret
@@:

View File

@ -386,23 +386,17 @@ proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
mov esi, sys_pgdir
mov edi, [tmp_task_pdir]
mov ecx, 384
mov ecx, (page_tabs shr 20)/4
cld
rep movsd
mov ecx, 384
xor eax, eax
cld
rep stosd
mov ecx, 256
mov esi, sys_pgdir+0xc00
rep movsd
mov eax, [dir_addr]
or eax, PG_SW
mov ebx, [tmp_task_pdir]
mov [ebx+0x600], eax
stosd ; [(page_tabs shr 20)]= eax
mov ecx, 0x800/4
xor eax, eax
rep stosd
mov eax, [dir_addr]
call set_cr3
@ -555,8 +549,8 @@ proc destroy_app_space stdcall, pg_dir:dword
and eax, not 0xFFF
stdcall map_page,[tmp_task_pdir],eax,dword PG_SW
mov esi, [tmp_task_pdir]
add esi, 0x604
mov edi, 383
add esi, 0x800
mov edi, 0x800/4
.destroy:
mov eax, [esi]
test eax, 1

View File

@ -65,9 +65,9 @@ R9800 equ 0x4E49 ;R350
R9800P equ 0x4E48 ;R350
R9800XT equ 0x4E4A ;R360
OS_BASE equ 0; 0x80400000
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
OS_BASE equ 0
new_app_base equ 0x80000000
PROC_BASE equ 0x0080000
PG_SW equ 0x003
PG_NOCACHE equ 0x018
@ -85,8 +85,8 @@ virtual at 0
IOCTL IOCTL
end virtual
;MMIO equ 0F9000000h
RD_RB3D_CNTL equ 1c3ch
;MMIO equ 0F9000000h
RD_RB3D_CNTL equ 1c3ch
RD_MEM_CNTL equ 0140h
RD_CRTC_GEN_CNTL equ 0050h
@ -232,7 +232,7 @@ proc service_proc stdcall, ioctl:dword
mov eax, [edi+input]
call video_free
.fail:
xor eax, eax
or eax, -1
ret
endp
@ -981,7 +981,7 @@ devices dd (R8500 shl 16)+VID_ATI
dd (R9800XT shl 16)+VID_ATI
dd 0 ;terminator
version dd 0x00030003
version dd 0x00040004
sz_ati_srv db 'HWCURSOR',0

View File

@ -67,7 +67,7 @@ proc setup_codec
xor eax, eax
stdcall codec_write, dword CODEC_AUX_VOL
mov eax, 0x1010
mov eax, 0x0B0B
stdcall codec_write, dword CODEC_MASTER_VOL_REG
mov ax, 0x08
@ -98,43 +98,40 @@ proc setup_codec
xor eax, eax ; exit with error
ret
endp
; param
; eax= volume -10000 - 0 for both channels
align 4
proc set_master_vol stdcall, vol:dword
mov ebx, 63
mov ecx, 20644
mov eax, [vol]
cmp eax, 90
jna @f
mov eax, 90
set_master_vol:
cmp eax, 0
jl @F
xor eax, eax
jmp .set
@@:
mul ecx
shr eax, 15
sub ebx, eax
mov ah, bl
mov al, bl
cmp eax, -9450
jg .set
mov eax, -9450 ;clamp into 6 bits
.set:
cdq
mov ebx, -150
idiv ebx
mov ah, al
stdcall codec_write, dword CODEC_MASTER_VOL_REG
xor eax, eax
ret
endp
align 4
proc get_master_vol stdcall, pvol:dword
stdcall codec_read, dword CODEC_MASTER_VOL_REG
and eax, 0x3F
mov ebx, 63
mov ecx, 20644
xchg eax, ebx
sub eax, ebx
shl eax, 15
xor edx, edx
div ecx
imul eax, -150
mov ebx, [pvol]
mov [ebx], eax
xor eax, eax
ret
endp

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
;
; This file is part of the Infinity sound AC97 driver.
; (C) copyright Serge 2006
; This file is part of the Infinity sound driver.
; (C) copyright Serge 2006-2007
; email: infinity_sound@mail.ru
;
; This program is free software; you can redistribute it and/or modify
@ -13,6 +13,20 @@
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
SOUND_VERSION equ 0x01000100
PLAY_SYNC equ 0x80000000
PCM_ALL equ 0
PCM_OUT equ 0x08000000
PCM_RING equ 0x10000000
PCM_STATIC equ 0x20000000
PCM_FLOAT equ 0x40000000 ;reserved
PCM_FILTER equ 0x80000000 ;reserved
PCM_2_16_48 equ 1
PCM_1_16_48 equ 2
@ -37,47 +51,53 @@ PCM_1_16_12 equ 14
PCM_2_16_11 equ 15
PCM_1_16_11 equ 16
PCM_2_8_48 equ 17
PCM_1_8_48 equ 18
PCM_2_16_8 equ 17
PCM_1_16_8 equ 18
PCM_2_8_44 equ 19
PCM_1_8_44 equ 20
PCM_2_8_48 equ 19
PCM_1_8_48 equ 20
PCM_2_8_32 equ 21
PCM_1_8_32 equ 22
PCM_2_8_44 equ 21
PCM_1_8_44 equ 22
PCM_2_8_24 equ 23
PCM_1_8_24 equ 24
PCM_2_8_32 equ 23
PCM_1_8_32 equ 24
PCM_2_8_22 equ 25
PCM_1_8_22 equ 26
PCM_2_8_24 equ 25
PCM_1_8_24 equ 26
PCM_2_8_16 equ 27
PCM_1_8_16 equ 28
PCM_2_8_22 equ 27
PCM_1_8_22 equ 28
PCM_2_8_12 equ 29
PCM_1_8_12 equ 30
PCM_2_8_16 equ 29
PCM_1_8_16 equ 30
PCM_2_8_11 equ 31
PCM_1_8_11 equ 32
PCM_2_8_12 equ 31
PCM_1_8_12 equ 32
SND_PLAY equ 1
SND_STOP equ 2
PCM_2_8_11 equ 33
PCM_1_8_11 equ 34
; struc SND_DEV
;{ .magic dd 0
; .size dd 0
; .count dd 0
; dd 0
; .snd_buff dd 16 dup (0)
;}
;virtual at 0
; SND_DEV SND_DEV
;end virtual
;SND_DEV_SIZE equ 80
PCM_2_8_8 equ 35
PCM_1_8_8 equ 36
SRV_GETVERSION equ 0
SND_CREATE_BUFF equ 1
SND_DESTROY_BUFF equ 2
SND_SETFORMAT equ 3
SND_GETFORMAT equ 4
SND_RESET equ 5
SND_SETPOS equ 6
SND_GETPOS equ 7
SND_SETBUFF equ 8
SND_OUT equ 9
SND_PLAY equ 10
SND_STOP equ 11
SND_SETVOLUME equ 12
SND_GETVOLUME equ 13
SND_SETPAN equ 14
SND_GETPAN equ 15
SND_GETBUFFSIZE equ 16
struc STREAM
{
@ -94,32 +114,35 @@ struc STREAM
.format dd ?
.flags dd ?
.work_buff dd ?
.work_read dd ?
.work_write dd ?
.work_count dd ?
.work_top dd ?
.out_base dd ?
.out_wp dd ?
.out_rp dd ?
.out_count dd ?
.out_top dd ?
.r_size dd ?
.r_end dd ?
.r_dt dd ?
.r_silence dd ?
.base dd ?
.limit dd ?
.seg_0 dd ?
.lim_0 dd ?
.seg_1 dd ?
.lim_1 dd ?
.curr_seg dd ?
.buff_size dd ?
.notify_off1 dd ?
.notify_off2 dd ?
; .notify_task dd ?
.resample dd ?
.l_vol dd ?
.r_vol dd ?
.l_amp dw ?
.r_amp dw ?
.pan dd ?
.in_base dd ?
.in_size dd ?
.in_wp dd ?
.in_rp dd ?
.in_count dd ?
.in_free dd ?
.in_top dd ?
.notify_event dd ?
.notify_id dd ?
}
STREAM_SIZE equ 31*4
STREAM_SIZE equ 34*4
FD_OFFSET equ 24
virtual at 0

View File

@ -13,93 +13,64 @@
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
align 4
mix_list rq 32
align 4
proc new_mix stdcall, output:dword
locals
mixCounter dd ?
mixIndex dd ?
streamIndex dd ?
inputCount dd ?
main_count dd ?
blockCount dd ?
mix_out dd ?
main_count rd 1
fpu_state rb 528 ;512+16
endl
mov [main_count], 32
call prepare_playlist
cmp [play_count], 0
je .exit
je .clear
lea eax, [fpu_state+16]
and eax, -16 ;must be 16b aligned
call FpuSave
mov [main_count], 32;
.l00:
mov [mix_buff_map], 0x0000FFFF;
xor eax, eax
mov [mixCounter], eax
mov [mixIndex],eax
mov [streamIndex], eax;
mov ebx, [play_count]
mov [inputCount], ebx
.l0:
mov ecx, 4
.l1:
mov ebx, [streamIndex]
mov esi, [play_list+ebx*4]
mov eax, [esi+STREAM.work_read]
add [esi+STREAM.work_read], 512
mov ebx, [mixIndex]
mov [mix_input+ebx*4], eax
inc [mixCounter]
inc [mixIndex]
inc [streamIndex]
dec [inputCount]
jz .m2
dec ecx
jnz .l1
cmp [mixCounter], 4
jnz .m2
stdcall mix_4_1, [mix_input],[mix_input+4],[mix_input+8],[mix_input+12]
sub [mixIndex],4
mov ebx, [mixIndex]
mov [mix_input+ebx*4], eax
inc [mixIndex]
mov [mixCounter], 0
cmp [inputCount], 0
jnz .l0
.m2:
cmp [mixIndex], 1
jne @f
stdcall copy_mem, [output], [mix_input]
jmp .m3
@@:
cmp [mixIndex], 2
jne @f
stdcall mix_2_1, [output], [mix_input], [mix_input+4]
jmp .m3
@@:
cmp [mixIndex], 3
jne @f
stdcall mix_3_1, [output],[mix_input],[mix_input+4],[mix_input+8]
jmp .m3
@@:
stdcall final_mix, [output],[mix_input],[mix_input+4],[mix_input+8], [mix_input+12]
.m3:
add [output],512
dec [main_count]
jnz .l00
call update_stream
emms
.mix:
lea eax, [mix_list]
call do_mix_list
test eax, eax
je .done
; cmp eax, 1
; je .copy
lea ebx, [mix_list]
stdcall mix_all, [output], ebx, eax
@@:
add [output], 512
dec [main_count]
jnz .mix
.exit:
lea eax, [fpu_state+16]
and eax, -16
call FpuRestore
ret
.exit:
.copy:
lea eax, [mix_list]
stdcall copy_mem, [output], [eax]
jmp @B
.done:
mov ecx, [main_count]
shl ecx, 7 ;ecx*= 512/4
mov edi, [output]
mov ecx, 0x1000
xor eax, eax
cld
rep stosd
jmp .exit
.clear:
mov edi, [output]
mov ecx, 4096
xor eax, eax
cld
rep stosd
@ -120,81 +91,62 @@ proc update_stream
mov edx, [stream_index]
mov esi, [play_list+edx*4]
mov eax, [esi+STREAM.work_read]
cmp eax, [esi+STREAM.work_top]
mov eax, [esi+STREAM.out_rp]
cmp eax, [esi+STREAM.out_top]
jb @f
sub eax, 64*1024
@@:
mov [esi+STREAM.work_read], eax
mov [esi+STREAM.out_rp], eax
cmp [esi+STREAM.format], PCM_2_16_48
cmp word [esi+STREAM.format], PCM_2_16_48
je .copy
sub [esi+STREAM.work_count], 16384
cmp [esi+STREAM.out_count], 16384
ja .skip
cmp [esi+STREAM.work_count], 32768
ja @f
test [esi+STREAM.format], PCM_RING
jnz .ring
stdcall refill, esi
@@:
.skip:
inc [stream_index]
dec [play_count]
jnz .l1
ret
.ring:
stdcall refill_ring, esi
jmp .skip
.copy:
mov ebx, esi
mov edi, [ebx+STREAM.work_write]
cmp edi, [ebx+STREAM.work_top]
mov edi, [ebx+STREAM.out_wp]
cmp edi, [ebx+STREAM.out_top]
jb @f
sub edi, 64*1024
mov [ebx+STREAM.work_write], edi
mov [ebx+STREAM.out_wp], edi
@@:
mov esi, [ebx+STREAM.curr_seg]
mov esi, [ebx+STREAM.in_rp]
mov ecx, 16384/4
cld
rep movsd
mov [ebx+STREAM.work_write], edi
mov [ebx+STREAM.out_wp], edi
cmp esi, [ebx+STREAM.lim_0]
cmp esi, [ebx+STREAM.in_top]
jb @f
mov esi, [ebx+STREAM.seg_0]
mov eax, [ebx+STREAM.lim_0]
xchg esi, [ebx+STREAM.seg_1]
xchg eax, [ebx+STREAM.lim_1]
mov [ebx+STREAM.seg_0], esi
mov [ebx+STREAM.lim_0], eax
sub esi, 0x10000
@@:
mov [ebx+STREAM.curr_seg], esi
mov [ebx+STREAM.in_rp], esi
xor ecx, ecx
cmp esi, [ebx+STREAM.notify_off2]
je @f
mov ecx,0x8000
cmp esi, [ebx+STREAM.notify_off1]
je @f
inc [stream_index]
dec [play_count]
jnz .l1
ret
@@:
mov [ev_code], 0xFF000001
mov [ev_offs], ecx
mov eax, [ebx+STREAM.pid]
lea edx, [ev_code]
push ebx
stdcall SendEvent, eax, edx
pop ebx
test eax, eax
jnz .l_end
not eax
mov [ebx+STREAM.pid], eax ;-1
jz .l_end
mov eax, [ebx+STREAM.notify_event]
mov ebx, [ebx+STREAM.notify_id]
mov ecx, EVENT_WATCHED
xor edx, edx
call RaiseEvent ;eax, ebx, ecx, edx
.l_end:
inc [stream_index]
dec [play_count]
@ -205,72 +157,186 @@ endp
align 4
proc refill stdcall, str:dword
locals
ev_code dd ? ;EVENT
ev_offs dd ?
rd 4
r_size rd 1
event rd 6
endl
mov ebx, [str]
mov edi, [ebx+STREAM.work_write]
cmp edi, [ebx+STREAM.work_top]
mov edi, [ebx+STREAM.out_wp]
cmp edi, [ebx+STREAM.out_top]
jb @F
sub edi, 64*1024
mov [ebx+STREAM.work_write], edi
sub edi, 0x10000
mov [ebx+STREAM.out_wp], edi
@@:
mov esi, [ebx+STREAM.curr_seg]
mov edi, [ebx+STREAM.work_write]
mov eax, [ebx+STREAM.in_count]
test eax, eax
jz .done
mov ecx, [ebx+STREAM.r_size]
cmp eax, ecx
jle @F
mov eax, ecx
@@:
mov ecx, eax
cmp word [ebx+STREAM.format], PCM_1_16_8
ja @F
shr eax, 1 ;two channles
@@:
test [ebx+STREAM.format], 1 ;even formats mono
jz @F
shr eax, 1 ;eax= samples
@@:
shl eax, 15 ;eax*=32768 =r_end
mov [r_size], ecx
mov esi, [ebx+STREAM.in_rp]
mov edi, [ebx+STREAM.out_wp]
stdcall [ebx+STREAM.resample], edi, esi, \
[ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end]
[ebx+STREAM.r_dt], ecx, eax
mov ebx, [str]
add [ebx+STREAM.work_count], eax;
add [ebx+STREAM.work_write], eax;
add [ebx+STREAM.out_count], eax;
add [ebx+STREAM.out_wp], eax;
mov eax, [ebx+STREAM.curr_seg]
add eax, [ebx+STREAM.r_size]
cmp eax, [ebx+STREAM.lim_0]
mov eax, [ebx+STREAM.in_rp]
mov ecx, [r_size]
add eax, ecx
add [ebx+STREAM.in_free], ecx
sub [ebx+STREAM.in_count], ecx
cmp eax, [ebx+STREAM.in_top]
jb @f
mov esi, [ebx+STREAM.seg_0]
lea edi, [esi-128]
add esi, 0x7F80
mov ecx, 128/4
cld
rep movsd
mov eax, [ebx+STREAM.seg_0]
mov ecx, [ebx+STREAM.lim_0]
xchg eax, [ebx+STREAM.seg_1]
xchg ecx, [ebx+STREAM.lim_1]
mov [ebx+STREAM.seg_0], eax
mov [ebx+STREAM.lim_0], ecx
sub eax, [ebx+STREAM.in_size]
@@:
mov [ebx+STREAM.curr_seg], eax
mov [ebx+STREAM.in_rp], eax
xor ecx, ecx
cmp eax, [ebx+STREAM.notify_off2]
je @f
mov ecx,0x8000
cmp eax, [ebx+STREAM.notify_off1]
je @f
ret
@@:
mov [ev_code], 0xFF000001
mov [ev_offs], ecx
mov eax, [ebx+STREAM.pid]
lea edx, [ev_code]
push ebx
stdcall SendEvent, eax, edx
pop ebx
.done:
mov eax, [ebx+STREAM.notify_event]
test eax, eax
jnz @F
not eax
mov [ebx+STREAM.pid], eax ;-1
jz .exit
mov ebx, [ebx+STREAM.notify_id]
mov ecx, EVENT_WATCHED
xor edx, edx
call RaiseEvent ;eax, ebx, ecx, edx
.exit:
ret
endp
align 4
proc refill_ring stdcall, str:dword
locals
event rd 6
endl
mov ebx, [str]
mov edi, [ebx+STREAM.out_wp]
cmp edi, [ebx+STREAM.out_top]
jb @F
sub edi, 0x10000
mov [ebx+STREAM.out_wp], edi
@@:
mov ecx, [ebx+STREAM.r_size]
mov eax, ecx
cmp word [ebx+STREAM.format], PCM_1_16_8
ja @F
shr eax, 1 ;two channles
@@:
test [ebx+STREAM.format], 1 ;even formats mono
jz @F
shr eax, 1 ;eax= samples
@@:
shl eax, 15 ;eax*=32768 =r_end
mov esi, [ebx+STREAM.in_rp]
mov edi, [ebx+STREAM.out_wp]
stdcall [ebx+STREAM.resample], edi, esi, \
[ebx+STREAM.r_dt], ecx, eax
mov ebx, [str]
add [ebx+STREAM.out_count], eax;
add [ebx+STREAM.out_wp], eax;
mov eax, [ebx+STREAM.in_rp]
mov ecx, [ebx+STREAM.r_size]
add eax, ecx
add [ebx+STREAM.in_free], ecx
sub [ebx+STREAM.in_count], ecx
cmp eax, [ebx+STREAM.in_top]
jb @f
sub eax, [ebx+STREAM.in_size]
@@:
mov [ebx+STREAM.in_rp], eax
sub eax, [ebx+STREAM.in_base]
sub eax, 128
lea edx, [event]
mov dword [edx], RT_INP_EMPTY
mov dword [edx+4], 0
mov dword [edx+8], ebx
mov dword [edx+12], eax
mov eax, [ebx+STREAM.notify_event]
test eax, eax
jz .exit
mov ebx, [ebx+STREAM.notify_id]
xor ecx, ecx
call RaiseEvent ;eax, ebx, ecx, edx
.exit:
ret
endp
align 4
proc mix_all stdcall, dest:dword, list:dword, count:dword
mov edi, [dest]
mov ebx, 64
.mix:
mov edx, [list]
mov ecx, [count]
mov eax, [edx]
movq mm0, [eax]
movd mm1, [edx+4]
punpckldq mm1,mm1
pmulhw mm0, mm1
psllw mm0, 1
.mix_loop:
add dword [edx], 8
add edx, 8
dec ecx
jz @F
mov eax, [edx]
movq mm1, [eax]
movd mm2, [edx+4]
punpckldq mm2,mm2
pmulhw mm1, mm2
psllw mm1, 1
paddsw mm0, mm1
jmp .mix_loop
@@:
movq [edi], mm0
add edi, 8
dec ebx
jnz .mix
ret
endp
@ -282,14 +348,14 @@ proc resample_1 stdcall, dest:dword,src:dword,\
; src equ esp+12
; r_dt equ esp+16
; r_size equ esp+20
;r_end equ esp+24
; r_end equ esp+24
mov edi, [dest]
mov edx, [src]
sub edx, 32*2
mov eax, 16
align 16
align 4
.l1:
mov ecx, eax
mov esi, eax
@ -342,7 +408,7 @@ proc resample_18 stdcall, dest:dword,src:dword,\
mov esi, 16
align 16
align 4
.l1:
mov ecx, esi
mov eax, esi
@ -413,7 +479,7 @@ proc resample_2 stdcall, dest:dword,src:dword,\
mov eax, 16
emms
align 16
align 4
.l1:
mov ecx, eax
mov esi, eax
@ -466,7 +532,7 @@ proc resample_28 stdcall, dest:dword,src:dword,\
movq mm7,[mm80]
movq mm6,[mm_mask]
align 16
align 4
.l1:
mov ecx, eax
mov esi, eax
@ -840,6 +906,8 @@ proc mix_4_1 stdcall, str0:dword, str1:dword,\
and eax, eax
jz .err
mov [output], eax
mov edi, eax
mov eax, [str0]
mov ebx, [str1]
@ -939,4 +1007,100 @@ proc memcpy
ret
endp
if 0
align 4
proc new_mix stdcall, output:dword
locals
mixCounter dd ?
mixIndex dd ?
streamIndex dd ?
inputCount dd ?
main_count dd ?
blockCount dd ?
mix_out dd ?
endl
call prepare_playlist
cmp [play_count], 0
je .exit
call FpuSave
mov [main_count], 32;
.l00:
mov [mix_buff_map], 0x0000FFFF;
xor eax, eax
mov [mixCounter], eax
mov [mixIndex],eax
mov [streamIndex], eax;
mov ebx, [play_count]
mov [inputCount], ebx
.l0:
mov ecx, 4
.l1:
mov ebx, [streamIndex]
mov esi, [play_list+ebx*4]
mov eax, [esi+STREAM.work_read]
add [esi+STREAM.work_read], 512
mov ebx, [mixIndex]
mov [mix_input+ebx*4], eax
inc [mixCounter]
inc [mixIndex]
inc [streamIndex]
dec [inputCount]
jz .m2
dec ecx
jnz .l1
cmp [mixCounter], 4
jnz .m2
stdcall mix_4_1, [mix_input],[mix_input+4],[mix_input+8],[mix_input+12]
sub [mixIndex],4
mov ebx, [mixIndex]
mov [mix_input+ebx*4], eax
inc [mixIndex]
mov [mixCounter], 0
cmp [inputCount], 0
jnz .l0
.m2:
cmp [mixIndex], 1
jne @f
stdcall copy_mem, [output], [mix_input]
jmp .m3
@@:
cmp [mixIndex], 2
jne @f
stdcall mix_2_1, [output], [mix_input], [mix_input+4]
jmp .m3
@@:
cmp [mixIndex], 3
jne @f
stdcall mix_3_1, [output],[mix_input],[mix_input+4],[mix_input+8]
jmp .m3
@@:
stdcall final_mix, [output],[mix_input],[mix_input+4],[mix_input+8], [mix_input+12]
.m3:
add [output],512
dec [main_count]
jnz .l00
call update_stream
emms
call FpuRestore
ret
.exit:
mov edi, [output]
mov ecx, 0x1000
xor eax, eax
cld
rep stosd
ret
endp
end if

View File

@ -44,15 +44,15 @@ BIT31 EQU 0x80000000
VID_SIS equ 0x1039
CTRL_SIS equ 0x7012
PCM_OUT_BDL equ 0x10 ; PCM out buffer descriptors list
PCM_OUT_CR_REG equ 0x1b ; PCM out Control Register
PCM_OUT_BDL equ 0x10 ; PCM out buffer descriptors list
PCM_OUT_CR_REG equ 0x1b ; PCM out Control Register
PCM_OUT_LVI_REG equ 0x15 ; PCM last valid index
PCM_OUT_SR_REG equ 0x18 ; PCM out Status register
PCM_OUT_SR_REG equ 0x18 ; PCM out Status register
PCM_OUT_PIV_REG equ 0x1a ; PCM out prefetched index
PCM_OUT_CIV_REG equ 0x14 ; PCM out current index
PCM_IN_CR_REG equ 0x0b ; PCM in Control Register
MC_IN_CR_REG equ 0x2b ; MIC in Control Register
MC_IN_CR_REG equ 0x2b ; MIC in Control Register
RR equ BIT1 ; reset registers. Nukes all regs
CODEC_MASTER_VOL_REG equ 0x02
@ -65,24 +65,24 @@ CODEC_PCM_SURND_DACRATE_REG equ 2eh ; surround sound sample rate
CODEC_PCM_LFE_DACRATE_REG equ 30h ; LFE sample rate
GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status
CTRL_CAS equ 0x34 ; Codec Access Semiphore
GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status
CTRL_CAS equ 0x34 ; Codec Access Semiphore
CAS_FLAG equ 0x01 ; Codec Access Semiphore Bit
CAS_FLAG equ 0x01 ; Codec Access Semiphore Bit
CTRL_ST_CREADY equ BIT8+BIT9+BIT28 ; Primary Codec Ready
CTRL_ST_CREADY equ BIT8+BIT9+BIT28 ; Primary Codec Ready
CTRL_ST_RCS equ 0x00008000 ; Read Completion Status
CTRL_ST_RCS equ 0x00008000 ; Read Completion Status
CTRL_CNT_CRIE equ BIT4+BIT5+BIT6 ; Codecs Resume Interrupt Enable
CTRL_CNT_AC_OFF equ 0x00000008 ; ACLINK Off
CTRL_CNT_WARM equ 0x00000004 ; AC97 Warm Reset
CTRL_CNT_COLD equ 0x00000002 ; AC97 Cold Reset
CTRL_CNT_GIE equ 0x00000001 ; GPI Interrupt Enable
CTRL_CNT_CRIE equ BIT4+BIT5+BIT6 ; Codecs Resume Interrupt Enable
CTRL_CNT_AC_OFF equ 0x00000008 ; ACLINK Off
CTRL_CNT_WARM equ 0x00000004 ; AC97 Warm Reset
CTRL_CNT_COLD equ 0x00000002 ; AC97 Cold Reset
CTRL_CNT_GIE equ 0x00000001 ; GPI Interrupt Enable
CODEC_REG_POWERDOWN equ 0x26
CODEC_REG_ST equ 0x26
CODEC_REG_ST equ 0x26
DEV_PLAY equ 1
@ -217,24 +217,24 @@ struc CODEC ;Audio Chip base class
}
struc CTRL_INFO
{ .pci_cmd dd ?
.irq dd ?
.glob_cntrl dd ?
.glob_sta dd ?
.codec_io_base dd ?
.ctrl_io_base dd ?
.codec_mem_base dd ?
.ctrl_mem_base dd ?
.codec_id dd ?
{ .pci_cmd dd ?
.irq dd ?
.glob_cntrl dd ?
.glob_sta dd ?
.codec_io_base dd ?
.ctrl_io_base dd ?
.codec_mem_base dd ?
.ctrl_mem_base dd ?
.codec_id dd ?
}
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
@ -243,9 +243,9 @@ end virtual
EVENT_NOTIFY equ 0x00000200
OS_BASE equ 0; 0x80400000
new_app_base equ 0x60400000; 0x01000000
PROC_BASE equ OS_BASE+0x0080000
OS_BASE equ 0; 0x80400000
PROC_BASE equ OS_BASE+0x0080000
new_app_base equ 0x80000000
public START
public service_proc
@ -361,16 +361,15 @@ proc service_proc stdcall, ioctl:dword
@@:
cmp eax, DEV_SET_MASTERVOL
jne @F
mov ebx, [edi+input]
stdcall set_master_vol, [ebx]
mov eax, [edi+input]
mov eax, [eax]
call set_master_vol ;eax= vol
ret
@@:
cmp eax, DEV_GET_MASTERVOL
jne @F
mov ebx, [edi+output]
test ebx, ebx
jz .fail
add ebx, new_app_base
stdcall get_master_vol, ebx
ret
@@:
@ -381,7 +380,7 @@ proc service_proc stdcall, ioctl:dword
ret
@@:
.fail:
xor eax, eax
or eax, -1
ret
endp
@ -401,7 +400,7 @@ proc ac97_irq
; end if
mov edx, PCM_OUT_CR_REG
mov al, 0x14
mov al, 0x10
call [ctrl.ctrl_write8]
mov ax, 0x1c
@ -424,11 +423,11 @@ proc ac97_irq
call [ctrl.ctrl_write8]
mov edx, PCM_OUT_CR_REG
mov ax, 0x1D
mov ax, 0x11
call [ctrl.ctrl_write8]
mov eax, [civ_val]
add eax, 2
add eax, 1
and eax, 31
mov ebx, dword [buff_list+eax*4]
@ -441,7 +440,7 @@ proc ac97_irq
.skip:
mov edx, PCM_OUT_CR_REG
mov ax, 0x1D
mov ax, 0x11
call [ctrl.ctrl_write8]
ret
endp
@ -455,6 +454,7 @@ proc create_primary_buff
mov edi, eax
mov ecx, 0x10000/4
xor eax, eax
cld
rep stosd
mov eax, [ctrl.buffer]
@ -1132,7 +1132,7 @@ align 4
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
dd 0
version dd 0x00030003
version dd 0x00040004
msg_AC db '7012 AC97 controller',13,10, 0
msg_SIS db 'Silicon Integrated Systems',13,10, 0

View File

@ -51,38 +51,38 @@ BIT29 EQU 0x20000000
BIT30 EQU 0x40000000
BIT31 EQU 0x80000000
VID_INTEL equ 0x8086
VID_NVIDIA equ 0x10DE
VID_INTEL equ 0x8086
VID_NVIDIA equ 0x10DE
CTRL_ICH equ 0x2415
CTRL_ICH0 equ 0x2425
CTRL_ICH2 equ 0x2435
CTRL_ICH3 equ 0x2445
CTRL_ICH4 equ 0x24C5
CTRL_ICH5 equ 0x24D5
CTRL_ICH6 equ 0x266E
CTRL_ICH7 equ 0x27DE
CTRL_ICH equ 0x2415
CTRL_ICH0 equ 0x2425
CTRL_ICH2 equ 0x2435
CTRL_ICH3 equ 0x2445
CTRL_ICH4 equ 0x24C5
CTRL_ICH5 equ 0x24D5
CTRL_ICH6 equ 0x266E
CTRL_ICH7 equ 0x27DE
CTRL_NFORCE equ 0x01B1
CTRL_NFORCE2 equ 0x006A
CTRL_NFORCE3 equ 0x00DA
CTRL_MCP04 equ 0x003A
CTRL_CK804 equ 0x0059
CTRL_CK8 equ 0x008A
CTRL_CK8S equ 0x00EA
CTRL_MCP51 equ 0x026B
CTRL_NFORCE equ 0x01B1
CTRL_NFORCE2 equ 0x006A
CTRL_NFORCE3 equ 0x00DA
CTRL_MCP04 equ 0x003A
CTRL_CK804 equ 0x0059
CTRL_CK8 equ 0x008A
CTRL_CK8S equ 0x00EA
CTRL_MCP51 equ 0x026B
PCM_OUT_BDL equ 0x10 ; PCM out buffer descriptors list
PCM_OUT_BDL equ 0x10 ; PCM out buffer descriptors list
PCM_OUT_CR_REG equ 0x1b ; PCM out Control Register
PCM_OUT_LVI_REG equ 0x15 ; PCM last valid index
PCM_OUT_LVI_REG equ 0x15 ; PCM last valid index
PCM_OUT_SR_REG equ 0x16 ; PCM out Status register
PCM_OUT_PIV_REG equ 0x1a
PCM_OUT_CIV_REG equ 0x14 ; PCM out current index
PCM_OUT_PIV_REG equ 0x1a
PCM_OUT_CIV_REG equ 0x14 ; PCM out current index
PCM_IN_CR_REG equ 0x0b ; PCM in Control Register
MC_IN_CR_REG equ 0x2b ; MIC in Control Register
RR equ BIT1 ; reset registers. Nukes all regs
PCM_IN_CR_REG equ 0x0b ; PCM in Control Register
MC_IN_CR_REG equ 0x2b ; MIC in Control Register
RR equ BIT1 ; reset registers. Nukes all regs
CODEC_MASTER_VOL_REG equ 0x02
CODEC_AUX_VOL equ 0x04 ;
@ -93,21 +93,21 @@ CODEC_PCM_FRONT_DACRATE_REG equ 2ch ; PCM out sample rate
CODEC_PCM_SURND_DACRATE_REG equ 2eh ; surround sound sample rate
CODEC_PCM_LFE_DACRATE_REG equ 30h ; LFE sample rate
GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status
CTRL_CAS equ 0x34 ; Codec Access Semiphore
GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status
CTRL_CAS equ 0x34 ; Codec Access Semiphore
CAS_FLAG equ 0x01 ; Codec Access Semiphore Bit
CAS_FLAG equ 0x01 ; Codec Access Semiphore Bit
CTRL_ST_CREADY equ BIT8+BIT9+BIT28 ; Primary Codec Ready
CTRL_ST_CREADY equ BIT8+BIT9+BIT28 ; Primary Codec Ready
CTRL_ST_RCS equ 0x00008000 ; Read Completion Status
CTRL_ST_RCS equ 0x00008000 ; Read Completion Status
CTRL_CNT_CRIE equ BIT4+BIT5+BIT6 ; Codecs Resume Interrupt Enable
CTRL_CNT_AC_OFF equ 0x00000008 ; ACLINK Off
CTRL_CNT_WARM equ 0x00000004 ; AC97 Warm Reset
CTRL_CNT_COLD equ 0x00000002 ; AC97 Cold Reset
CTRL_CNT_GIE equ 0x00000001 ; GPI Interrupt Enable
CTRL_CNT_CRIE equ BIT4+BIT5+BIT6 ; Codecs Resume Interrupt Enable
CTRL_CNT_AC_OFF equ 0x00000008 ; ACLINK Off
CTRL_CNT_WARM equ 0x00000004 ; AC97 Warm Reset
CTRL_CNT_COLD equ 0x00000002 ; AC97 Cold Reset
CTRL_CNT_GIE equ 0x00000001 ; GPI Interrupt Enable
CODEC_REG_POWERDOWN equ 0x26
CODEC_REG_ST equ 0x26
@ -271,8 +271,8 @@ end virtual
EVENT_NOTIFY equ 0x00000200
OS_BASE equ 0;
new_app_base equ 0x60400000
PROC_BASE equ OS_BASE+0x0080000
PROC_BASE equ OS_BASE+0x0080000
new_app_base equ 0x80000000
public START
public service_proc
@ -405,27 +405,26 @@ proc service_proc stdcall, ioctl:dword
@@:
cmp eax, DEV_SET_MASTERVOL
jne @F
mov ebx, [edi+input]
stdcall set_master_vol, [ebx]
mov eax, [edi+input]
mov eax, [eax]
call set_master_vol ;eax= vol
ret
@@:
cmp eax, DEV_GET_MASTERVOL
jne @F
mov ebx, [edi+output]
test ebx, ebx
jz .fail
add ebx, new_app_base
stdcall get_master_vol, ebx
ret
@@:
cmp eax, DEV_GET_INFO
jne @F
mov ebx, [edi+output]
stdcall get_dev_info, ebx
ret
;@@:
; cmp eax, DEV_GET_INFO
; jne @F
; mov ebx, [edi+output]
; stdcall get_dev_info, ebx
; ret
@@:
.fail:
xor eax, eax
or eax, -1
ret
endp
@ -763,8 +762,8 @@ proc set_ICH
ret
endp
PG_SW equ 0x003
PG_NOCACHE equ 0x018
PG_SW equ 0x003
PG_NOCACHE equ 0x018
align 4
proc set_ICH4
@ -1004,8 +1003,7 @@ proc cold_reset
endp
align 4
proc play
play:
mov eax, 16
mov [ctrl.lvi_reg], eax
mov edx, PCM_OUT_LVI_REG
@ -1014,11 +1012,11 @@ proc play
mov edx, PCM_OUT_CR_REG
mov ax, 0x1D
call [ctrl.ctrl_write8]
xor eax, eax
ret
endp
align 4
proc stop
stop:
mov edx, PCM_OUT_CR_REG
mov ax, 0x0
call [ctrl.ctrl_write8]
@ -1026,8 +1024,8 @@ proc stop
mov ax, 0x1c
mov edx, PCM_OUT_SR_REG
call [ctrl.ctrl_write16]
xor eax, eax
ret
endp
align 4
proc get_dev_info stdcall, p_info:dword
@ -1334,9 +1332,9 @@ include "codec.inc"
align 4
devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
dd (CTRL_ICH3 shl 16)+VID_INTEL,msg_ICH3,set_ICH
dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
dd (CTRL_ICH3 shl 16)+VID_INTEL,msg_ICH3,set_ICH
dd (CTRL_ICH4 shl 16)+VID_INTEL,msg_ICH4,set_ICH4
dd (CTRL_ICH5 shl 16)+VID_INTEL,msg_ICH5,set_ICH4
dd (CTRL_ICH6 shl 16)+VID_INTEL,msg_ICH6,set_ICH4
@ -1353,7 +1351,7 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
dd 0 ;terminator
version dd 0x00030003
version dd 0x00040004
msg_ICH db 'Intel ICH', 13,10, 0
msg_ICH0 db 'Intel ICH0', 13,10, 0

View File

@ -169,7 +169,7 @@ include 'unpacker.inc'
__DEBUG__ fix 1
__DEBUG_LEVEL__ fix 1
include 'debug-fdo.inc'
include 'fdo.inc'
iglobal
boot_memdetect db 'Determining amount of memory',0
@ -370,33 +370,33 @@ B32:
; btr [cpu_caps], CAPS_PGE ;test: don't use global pages
; btr [cpu_caps], CAPS_MTRR ;test: don't use MTRR
bts [cpu_caps], CAPS_TSC ;force use rdtsc
; -------- Fast System Call init ----------
; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
bt [cpu_caps], CAPS_SEP
jnc .SEnP ; SysEnter not Present
xor edx, edx
mov ecx, MSR_SYSENTER_CS
mov eax, os_code
wrmsr
mov ecx, MSR_SYSENTER_ESP
mov eax, sysenter_stack ; Check it
wrmsr
mov ecx, MSR_SYSENTER_EIP
mov eax, sysenter_entry
wrmsr
; Intel SYSENTER/SYSEXIT (AMD CPU support it too)
bt [cpu_caps], CAPS_SEP
jnc .SEnP ; SysEnter not Present
xor edx, edx
mov ecx, MSR_SYSENTER_CS
mov eax, os_code
wrmsr
mov ecx, MSR_SYSENTER_ESP
mov eax, sysenter_stack ; Check it
wrmsr
mov ecx, MSR_SYSENTER_EIP
mov eax, sysenter_entry
wrmsr
.SEnP:
; AMD SYSCALL/SYSRET
cmp byte[cpu_vendor], 'A'
jne .noSYSCALL
mov eax, 0x80000001
cpuid
test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support
jz .noSYSCALL
mov ecx, MSR_AMD_EFER
rdmsr
or eax, 1 ; bit_0 - System Call Extension (SCE)
wrmsr
; AMD SYSCALL/SYSRET
cmp byte[cpu_vendor], 'A'
jne .noSYSCALL
mov eax, 0x80000001
cpuid
test edx, 0x800 ; bit_11 - SYSCALL/SYSRET support
jz .noSYSCALL
mov ecx, MSR_AMD_EFER
rdmsr
or eax, 1 ; bit_0 - System Call Extension (SCE)
wrmsr
; !!!! It`s dirty hack, fix it !!!
; Bits of EDX :
@ -406,16 +406,19 @@ B32:
; and the contents of this field, plus 8, are copied into the SS register.
; mov edx, (os_code + 16) * 65536 + os_code
mov edx, 0x1B0013
mov edx, 0x1B0013
mov eax, syscall_entry
mov ecx, MSR_AMD_STAR
wrmsr
mov eax, syscall_entry
mov ecx, MSR_AMD_STAR
wrmsr
.noSYSCALL:
; -----------------------------------------
; MEMORY MODEL
call mem_test
call init_mtrr
call init_mem
call init_page_map
@ -430,8 +433,8 @@ B32:
call init_kernel_heap
stdcall kernel_alloc, 0x2000
mov [os_stack], eax
call init_LFB
call init_mtrr
call init_fpu
call init_malloc
@ -4872,6 +4875,7 @@ read_from_hd: ; Read from hd - fn not in use
align 4
paleholder:
ret
; --------------- APM ---------------------
apm_entry dp 0
apm_vf dd 0
@ -5066,7 +5070,7 @@ endg
if __DEBUG__ eq 1
include_debug_strings
end if
end if
IncludeIGlobals
endofcode:

View File

@ -211,8 +211,14 @@
;
;
; 0x0098B000 -> kernel heap
;
; 0x01FFFFFF heam min limit
; 0x7DBFFFFF heap max limit
; 0x7DC00000 -> 0x7FBFFFFF LFB 32Mb
; 0x7DC00000 -> 0x7E3FFFFF application available LFB 8Mb
; 0x7E400000 -> 0x7FBFFFFF kernel LFB part 24 Mb
; 0x7FC00000 -> 0x7FFFFFFF page tables 4Mb
; 0x80000000 -> 0xFFFFFFFF application 2Gb