forked from KolibriOS/kolibrios
kos-acpi: set_framebuffer()
git-svn-id: svn://kolibrios.org@6252 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
3f4201dc21
commit
227be33173
@ -685,7 +685,7 @@ struct display_t
|
|||||||
height dd ?
|
height dd ?
|
||||||
bits_per_pixel dd ?
|
bits_per_pixel dd ?
|
||||||
vrefresh dd ?
|
vrefresh dd ?
|
||||||
lfb dd ?
|
current_lfb dd ?
|
||||||
lfb_pitch dd ?
|
lfb_pitch dd ?
|
||||||
|
|
||||||
win_map_lock RWSEM
|
win_map_lock RWSEM
|
||||||
|
@ -56,6 +56,7 @@ __exports:
|
|||||||
\
|
\
|
||||||
get_display, 'GetDisplay', \
|
get_display, 'GetDisplay', \
|
||||||
set_screen, 'SetScreen', \
|
set_screen, 'SetScreen', \
|
||||||
|
set_framebuffer, 'SetFramebuffer', \ ; gcc fastcall
|
||||||
window._.get_rect, 'GetWindowRect', \ ; gcc fastcall
|
window._.get_rect, 'GetWindowRect', \ ; gcc fastcall
|
||||||
pci_api_drv, 'PciApi', \
|
pci_api_drv, 'PciApi', \
|
||||||
pci_read8, 'PciRead8', \ ; stdcall
|
pci_read8, 'PciRead8', \ ; stdcall
|
||||||
|
@ -404,95 +404,6 @@ proc create_trampoline_pgmap
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
|
||||||
proc init_LFB
|
|
||||||
locals
|
|
||||||
pg_count dd ?
|
|
||||||
endl
|
|
||||||
|
|
||||||
cmp dword [LFBAddress], -1
|
|
||||||
jne @f
|
|
||||||
mov [BOOT_VARS+BOOT_MTRR], byte 2
|
|
||||||
; max VGA=640*480*4=1228800 bytes
|
|
||||||
; + 32*640*4=81920 bytes for mouse pointer
|
|
||||||
stdcall alloc_pages, ((1228800+81920)/4096)
|
|
||||||
|
|
||||||
push eax
|
|
||||||
call alloc_page
|
|
||||||
stdcall map_page_table, LFB_BASE, eax
|
|
||||||
pop eax
|
|
||||||
or eax, PG_UWR
|
|
||||||
mov ebx, LFB_BASE
|
|
||||||
; max VGA=640*480*4=1228800 bytes
|
|
||||||
; + 32*640*4=81920 bytes for mouse pointer
|
|
||||||
mov ecx, (1228800+81920)/4096
|
|
||||||
call commit_pages
|
|
||||||
mov [LFBAddress], dword LFB_BASE
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
test [SCR_MODE], word 0100000000000000b
|
|
||||||
jnz @f
|
|
||||||
mov [BOOT_VARS+BOOT_MTRR], byte 2
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
call init_mtrr
|
|
||||||
|
|
||||||
mov edx, LFB_BASE
|
|
||||||
mov esi, [LFBAddress]
|
|
||||||
mov edi, 0x00C00000
|
|
||||||
mov dword [exp_lfb+4], edx
|
|
||||||
|
|
||||||
shr edi, 12
|
|
||||||
mov [pg_count], edi
|
|
||||||
shr edi, 10
|
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PSE
|
|
||||||
jnc .map_page_tables
|
|
||||||
or esi, PDE_LARGE+PG_UWR
|
|
||||||
mov edx, sys_proc+PROC.pdt_0+(LFB_BASE shr 20)
|
|
||||||
@@:
|
|
||||||
mov [edx], esi
|
|
||||||
add edx, 4
|
|
||||||
add esi, 0x00400000
|
|
||||||
dec edi
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
bt [cpu_caps], CAPS_PGE
|
|
||||||
jnc @F
|
|
||||||
or dword [sys_proc+PROC.pdt_0+(LFB_BASE shr 20)], PG_GLOBAL
|
|
||||||
@@:
|
|
||||||
mov dword [LFBAddress], LFB_BASE
|
|
||||||
mov eax, cr3 ;flush TLB
|
|
||||||
mov cr3, eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
.map_page_tables:
|
|
||||||
|
|
||||||
@@:
|
|
||||||
call alloc_page
|
|
||||||
stdcall map_page_table, edx, eax
|
|
||||||
add edx, 0x00400000
|
|
||||||
dec edi
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
mov eax, [LFBAddress]
|
|
||||||
mov edi, page_tabs + (LFB_BASE shr 10)
|
|
||||||
or eax, PG_GLOBAL+PG_UWR
|
|
||||||
and eax, [pte_valid_mask]
|
|
||||||
mov ecx, [pg_count]
|
|
||||||
cld
|
|
||||||
@@:
|
|
||||||
stosd
|
|
||||||
add eax, 0x1000
|
|
||||||
loop @B
|
|
||||||
|
|
||||||
mov dword [LFBAddress], LFB_BASE
|
|
||||||
mov eax, cr3 ;flush TLB
|
|
||||||
mov cr3, eax
|
|
||||||
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc new_mem_resize stdcall, new_size:dword
|
proc new_mem_resize stdcall, new_size:dword
|
||||||
|
|
||||||
|
@ -534,6 +534,11 @@ high_code:
|
|||||||
mov ax, tss0
|
mov ax, tss0
|
||||||
ltr ax
|
ltr ax
|
||||||
|
|
||||||
|
mov eax, sys_proc
|
||||||
|
list_init eax
|
||||||
|
add eax, PROC.thr_list
|
||||||
|
list_init eax
|
||||||
|
|
||||||
call init_video
|
call init_video
|
||||||
call init_mtrr
|
call init_mtrr
|
||||||
mov [LFBAddress], LFB_BASE
|
mov [LFBAddress], LFB_BASE
|
||||||
@ -625,14 +630,9 @@ high_code:
|
|||||||
mov esi, boot_setostask
|
mov esi, boot_setostask
|
||||||
call boot_log
|
call boot_log
|
||||||
|
|
||||||
mov eax, sys_proc
|
mov edi, sys_proc+PROC.heap_lock
|
||||||
lea edi, [eax+PROC.heap_lock]
|
|
||||||
mov ecx, (PROC.ht_free-PROC.heap_lock)/4
|
mov ecx, (PROC.ht_free-PROC.heap_lock)/4
|
||||||
|
|
||||||
list_init eax
|
|
||||||
add eax, PROC.thr_list
|
|
||||||
list_init eax
|
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
cld
|
cld
|
||||||
rep stosd
|
rep stosd
|
||||||
|
@ -203,14 +203,41 @@ init_video:
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
set_framebuffer:
|
set_framebuffer:
|
||||||
mov edx, LFB_BASE shr 22
|
push esi
|
||||||
mov eax, [ecx+FRB.pde]
|
push edi
|
||||||
mov dword [master_tab+edx*4], eax
|
lea esi, [ecx+FRB.pde]
|
||||||
mov eax, [ecx+FRB.pde+4]
|
mov eax, sys_proc
|
||||||
mov dword [master_tab+edx*4+4], eax
|
|
||||||
mov eax, [ecx+FRB.pde+8]
|
pushfd
|
||||||
mov dword [master_tab+edx*4+8], eax
|
cli
|
||||||
mov eax, [ecx+FRB.pde+12]
|
mov [_display.current_lfb], ecx
|
||||||
mov dword [master_tab+edx*4+12], eax
|
|
||||||
|
.patch_pde:
|
||||||
|
lea edi, [eax+PROC.pdt_0+4096-32] ;last 8 pd entries up to 32Mb framebuffer
|
||||||
|
mov ecx, 8
|
||||||
|
rep movsd ;patch pde
|
||||||
|
sub esi, 32
|
||||||
|
mov edi, [eax+PROC.list.next] ;next process/address space
|
||||||
|
xchg eax, edi
|
||||||
|
cmp eax, edi
|
||||||
|
jne .patch_pde
|
||||||
|
|
||||||
|
bt [cpu_caps], CAPS_PGE
|
||||||
|
jnc .cr3_flush
|
||||||
|
|
||||||
|
mov eax, cr4
|
||||||
|
btr eax, 7 ;clear cr4.PGE
|
||||||
|
mov cr4, eax ;flush TLB
|
||||||
|
bts eax, 7
|
||||||
|
mov cr4, eax ;flush TLB
|
||||||
|
.exit:
|
||||||
|
popfd
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.cr3_flush:
|
||||||
|
mov eax, cr3
|
||||||
|
mov cr3, eax ;flush TLB
|
||||||
|
jmp .exit
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user