/kernel/branches/Kolibri-A/trunk/boot/bootcode.inc |
---|
1,13 → 1,13 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; BOOTCODE.INC ;; |
;; ;; |
;; KolibriOS 16-bit loader, ;; |
;; based on bootcode for MenuetOS ;; |
;; Kolibri-A auxiliary 16-bit code, ;; |
;; based on bootcode for KolibriOS ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
119,18 → 119,7 |
push cs |
pop es |
if 0 |
; set videomode |
mov ax, 3 |
int 0x10 |
; draw frames |
push 0xb800 |
pop es |
xor di, di |
mov ah, 1*16+15 |
end if |
cpugood: |
push 0 |
298,13 → 287,7 |
dec al |
mov [boot_dev], al |
; GET MEMORY MAP |
include 'detect/biosmem.inc' |
; READ DISKETTE TO MEMORY |
; SET GRAPHICS |
xor ax, ax |
/kernel/branches/Kolibri-A/trunk/bus/USER/special.inc |
---|
0,0 → 1,20 |
; |
; Kolibri-A Special service template -- art_zh 2011 |
; |
; ah = syscall function# (default: 255) |
; al = subfunction |
; |
align 4 |
special_srv: |
mov cl, ah |
and cl, 3 |
call dword[spec_servetable + ecx*4] |
ret |
align 4 |
spec_servetable: |
dd paleholder ; set something special here |
dd paleholder |
dd paleholder |
dd paleholder |
/kernel/branches/Kolibri-A/trunk/bus/USER |
---|
Property changes: |
Added: bugtraq:number |
+true |
\ No newline at end of property |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/kernel/branches/Kolibri-A/trunk/const.inc |
---|
26,10 → 26,10 |
CPU_P6 equ 6 |
CPU_PENTIUM4 equ 0x0F |
PLATFORM equ 0x14 |
PLATFORM_RS780 equ 0x0F |
PLATFORM_RS880 equ 0x10 |
PLATFORM_FUSION equ 0x14 |
PLATFORM equ 0x14 |
PLATFORM_RS780 equ 0x0F |
PLATFORM_RS880 equ 0x10 |
PLATFORM_FUSION equ 0x14 |
CAPS_FPU equ 00 ;on-chip x87 floating point unit |
CAPS_VME equ 01 ;virtual-mode enhancements |
298,7 → 298,7 |
RAMDISK_FAT equ (OS_BASE+0x0280000) |
FLOPPY_FAT equ (OS_BASE+0x0282000) |
CLEAN_ZONE equ 0x280000 |
CLEAN_ZONE equ 0x280000 |
IDE_DMA equ 0x284000 |
BgrAuxTable equ (OS_BASE+0x0298000) |
309,7 → 309,7 |
BUTTON_INFO equ (OS_BASE+0x02C0000) |
RESERVED_PORTS equ (OS_BASE+0x02D0000) |
IRQ_SAVE equ (OS_BASE+0x02E0000) |
;BOOT_VAR equ (OS_BASE+0x02F0000) |
;BOOT_VAR equ (OS_BASE+0x02F0000) |
stack_data_start equ (OS_BASE+0x0300000) |
335,10 → 335,11 |
end virtual |
HEAP_BASE equ (OS_BASE+0x0800000) |
HEAP_MIN_SIZE equ 0x01000000 |
HEAP_MIN_SIZE equ 0x02000000 |
PCIe_CONFIG_SPACE equ 0xF0000000 |
USER_DMA_BUFFER equ 0xFD000000 ; linear addr. |
USER_DMA_SIZE equ 0x00800000 |
page_tabs equ 0xFDC00000 |
app_page_tabs equ 0xFDC00000 |
/kernel/branches/Kolibri-A/trunk/core/memory.inc |
---|
337,7 → 337,7 |
align 4 |
proc init_LFB |
call init_mtrr |
stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC |
mov edx, LFB_BASE |
mov esi, [LFBAddress] |
364,16 → 364,16 |
align 4 |
init_userDMA: |
stdcall alloc_pages, 4096 ; 16M <<<<<<<<<<+++++++++++++++++++++++++++++++++ |
add eax, 0x007FFFF0 ; terrible mess, sorry ... |
and eax, 0xFF800000 ; align at 8M boundary |
mov [UserDMAaddr], eax |
or eax, PG_LARGE + PG_UW + PG_NOCACHE |
stdcall set_mtrr, [UserDMAaddr], USER_DMA_SIZE, MEM_UC ; <<<<<<<<<<+++++++++++++++++++++++++++++++++ |
mov eax, [UserDMAaddr] ; phys. addr, 8M-aligned |
or eax, PG_GLOBAL+PG_LARGE + PG_UW + PG_NOCACHE |
mov ebx, sys_pgdir + (USER_DMA_BUFFER shr 20) |
mov [ebx], eax |
add ebx, 4 |
add eax, 0x00400000 |
mov [ebx], eax |
mov eax, cr3 ;flush TLB |
mov cr3, eax |
ret |
1249,75 → 1249,6 |
align 4 |
proc init_mtrr |
cmp [BOOT_VAR+0x901c],byte 2 |
je .exit |
bt [cpu_caps], CAPS_MTRR |
jnc .exit |
mov eax, cr0 |
or eax, 0x60000000 ;disable caching |
mov cr0, eax |
wbinvd ;invalidate cache |
mov ecx, 0x2FF |
rdmsr ; |
; has BIOS already initialized MTRRs? |
test ah, 8 |
jnz .skip_init |
; rarely needed, so mainly placeholder |
; main memory - cached |
push eax |
mov eax, [MEM_AMOUNT] |
; round eax up to next power of 2 |
dec eax |
bsr ecx, eax |
mov ebx, 2 |
shl ebx, cl |
dec ebx |
; base of memory range = 0, type of memory range = MEM_WB |
xor edx, edx |
mov eax, MEM_WB |
mov ecx, 0x200 |
wrmsr |
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1 |
mov eax, 0xFFFFFFFF |
mov edx, 0x0000000F |
sub eax, ebx |
sbb edx, 0 |
or eax, 0x800 |
inc ecx |
wrmsr |
; clear unused MTRRs |
xor eax, eax |
xor edx, edx |
@@: |
wrmsr |
inc ecx |
cmp ecx, 0x210 |
jb @b |
; enable MTRRs |
pop eax |
or ah, 8 |
and al, 0xF0 ; default memtype = UC |
mov ecx, 0x2FF |
wrmsr |
.skip_init: |
stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC |
wbinvd ;again invalidate |
mov eax, cr0 |
and eax, not 0x60000000 |
mov cr0, eax ; enable caching |
.exit: |
ret |
endp |
align 4 |
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword |
; find unused register |
mov ecx, 0x201 |
1337,7 → 1268,11 |
.ret: |
ret |
.found: |
; found, write values |
mov eax, cr0 |
or eax, 0x60000000 ;disable caching |
mov cr0, eax |
wbinvd ;invalidate cache |
xor edx, edx |
mov eax, [base] |
or eax, [mem_type] |
1352,6 → 1287,12 |
or eax, 0x800 |
inc ecx |
wrmsr |
wbinvd ;again invalidate |
mov eax, cr0 |
and eax, not 0x60000000 |
mov cr0, eax ; enable caching |
ret |
endp |
/kernel/branches/Kolibri-A/trunk/core/syscall.inc |
---|
46,8 → 46,10 |
syscall_entry: |
; sti |
push ecx |
and eax, 3 |
call dword [servetable3 + eax * 4] |
xor ecx, ecx |
mov cl, al |
and cl, 7 |
call dword [servetable3 + ecx * 4] |
pop ecx |
sysret |
156,8 → 158,13 |
servetable3: ; Kolibri-A special service |
dd sys_rdmsr ; 0 = read MSR |
dd sys_map1 ; 1 = map any page (test only) |
dd sys_map1 ; 1 = get sys data (test only) |
dd paleholder ; 2 |
dd paleholder ; 3 |
dd paleholder ; 4 |
dd paleholder ; 5 |
dd paleholder ; 6 |
dd special_srv ; 7 = special service |
dd sys_end ; last |
endg |
/kernel/branches/Kolibri-A/trunk/data32.inc |
---|
255,6 → 255,7 |
gdte: |
align 16 |
diff16 "cur_saved_data (data32.inc) ", 0, $ |
cur_saved_data rb 4096 |
fpu_data: rb 512 |
282,6 → 283,7 |
irq_tab rd 16 |
diff16 "mem_block_map (data32.inc) ", 0, $ |
mem_block_map rb 512 |
mem_block_list rd 64 |
large_block_list rd 31 |
288,6 → 290,8 |
mem_block_mask rd 2 |
large_block_mask rd 1 |
diff16 "mem_used (data32.inc) ", 0, $ |
mem_used.fd rd 1 |
mem_used.bk rd 1 |
302,6 → 306,7 |
free_blocks rd 1 |
mst MEM_STATE |
diff16 "page_start (data32.inc) ", 0, $ |
page_start rd 1 |
page_end rd 1 |
331,6 → 336,8 |
;img_screen_y rd 1 |
align 64 |
diff16 "_WinMapAddress (data32.inc) ", 0, $ |
;_WinMapWidth rd 1 |
;_WinMapHeight rd 1 |
_WinMapAddress rd 1 |
363,6 → 370,8 |
tmp_task_pdir rd 1 |
tmp_task_ptab rd 1 |
diff16 "default_io_map (data32.inc) ", 0, $ |
default_io_map rd 1 |
LFBSize rd 1 |
/kernel/branches/Kolibri-A/trunk/detect/biosmem.inc |
---|
File deleted |
/kernel/branches/Kolibri-A/trunk/init.inc |
---|
18,7 → 18,7 |
; clear [CLEAN_ZONE..HEAP_BASE] |
xor eax,eax |
mov edi,CLEAN_ZONE ; 0x280000 = ramdisk FAT ? |
mov edi,CLEAN_ZONE ; 0x280000 = ramdisk FAT ? |
mov ecx,(HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4 |
cld |
rep stosd |
35,7 → 35,7 |
; save [0..0xffff] |
xor esi, esi |
mov edi, (BOOT_VAR - OS_BASE) ; low mem storage area |
mov edi, (BOOT_VAR - OS_BASE) ; low mem storage area |
mov ecx, 0x10000 / 4 |
rep movsd |
; clear [0x1000..0x0ffff] |
53,11 → 53,32 |
align 4 |
proc init_mem |
mov esi, (PCIe_CONFIG_SPACE-OS_BASE) ; esi will hold total amount of memory |
mov ecx, 0xC001001A ; Top of Memory MSR |
xor edi, edi |
rdmsr |
mov esi, eax ; esi = total amount of memory |
mov ecx, 0x0200 |
.read_mtrr: |
rdmsr |
and eax, 0xFFF00000 ; not just bitcleaning |
jz .next_mtrr ; ignore the main memory and free MTRRs |
cmp esi, eax |
jb .next_mtrr ; ignore MMIO blocks |
mov esi, eax |
.next_mtrr: |
add cl, 2 |
cmp cl, 0x10 |
jb .read_mtrr |
mov eax, USER_DMA_SIZE |
sub esi, eax ; exclude the Global DMA block... |
and esi, 0xFF800000 ; ...and the hole above it |
mov eax, esi |
mov [MEM_AMOUNT-OS_BASE], eax |
mov [pg_data.mem_amount-OS_BASE], eax ; the true MEMTOP |
mov [UserDMAaddr-OS_BASE], eax |
mov edx, esi ; edx will hold maximum allocatable address |
mov [MEM_AMOUNT-OS_BASE], esi |
mov [pg_data.mem_amount-OS_BASE], esi |
shr esi, 12 |
mov [pg_data.pages_count-OS_BASE], esi ; max number of PTEs ? |
/kernel/branches/Kolibri-A/trunk/kernel.asm |
---|
499,10 → 499,10 |
mov [graph_data_l+4],al |
mov [graph_data_l+7],ah |
; or [KERNEL_ALLOC_FLAG], dword PG_NOCACHE |
; or [KERNEL_ALLOC_FLAG], dword PG_NOCACHE ;<<<<<<<<<<<<<<<< |
stdcall kernel_alloc, [_WinMapSize] |
mov [_WinMapAddress], eax |
; xor [KERNEL_ALLOC_FLAG], dword PG_NOCACHE |
; xor [KERNEL_ALLOC_FLAG], dword PG_NOCACHE ;<<<<<<<<<<<<<<<< |
xor eax,eax |
inc eax |
/kernel/branches/Kolibri-A/trunk/kernel32.inc |
---|
248,6 → 248,7 |
;include "bus/pci/PCIe.inc" |
include "bus/HT.inc" ; AMD HyperTransport bus control |
include "bus/SB/SB.inc" |
include "bus/user/special.inc" |
; Floppy drive controller |
/kernel/branches/Kolibri-A/trunk/unpacker.inc |
---|
8,89 → 8,89 |
$Revision$ |
; void __stdcall unpack(void* packed_data, void* unpacked_data); |
; void __stdcall unpack(void* packed_data, void* unpacked_data); |
unpack: |
pushad |
mov esi, [esp+32+4] |
mov edi, [esp+32+8] |
mov eax, [esi+8] |
and al, 0xC0 |
cmp al, 0xC0 |
jz .failed |
mov eax, [esi+8] |
push eax |
add esi, 12 |
and al, not 0xC0 |
dec al |
jz .lzma |
pushad |
mov esi, [esp+32+4] |
mov edi, [esp+32+8] |
mov eax, [esi+8] |
and al, 0xC0 |
cmp al, 0xC0 |
jz .failed |
mov eax, [esi+8] |
push eax |
add esi, 12 |
and al, not 0xC0 |
dec al |
jz .lzma |
.failed: |
pop eax |
popad |
ret 8 |
pop eax |
popad |
ret 8 |
.lzma: |
call .lzma_unpack |
call .lzma_unpack |
.common: |
pop eax |
test al, 0x80 |
jnz .ctr1 |
test al, 0x40 |
jz .ok |
lodsd |
mov ecx, eax |
jecxz .ok |
mov dl, [esi] |
mov esi, [esp+32+8] |
pop eax |
test al, 0x80 |
jnz .ctr1 |
test al, 0x40 |
jz .ok |
lodsd |
mov ecx, eax |
jecxz .ok |
mov dl, [esi] |
mov esi, [esp+32+8] |
.c1: |
lodsb |
sub al, 0E8h |
cmp al, 1 |
ja .c1 |
cmp byte [esi], dl |
jnz .c1 |
lodsd |
lodsb |
sub al, 0E8h |
cmp al, 1 |
ja .c1 |
cmp byte [esi], dl |
jnz .c1 |
lodsd |
; "bswap eax" is not supported on i386 |
shr ax, 8 |
ror eax, 16 |
xchg al, ah |
sub eax, esi |
add eax, [esp+32+8] |
mov [esi-4], eax |
loop .c1 |
shr ax, 8 |
ror eax, 16 |
xchg al, ah |
sub eax, esi |
add eax, [esp+32+8] |
mov [esi-4], eax |
loop .c1 |
.ok: |
popad |
ret 8 |
popad |
ret 8 |
.ctr1: |
lodsd |
mov ecx, eax |
jecxz .ok |
mov dl, [esi] |
mov esi, [esp+32+8] |
lodsd |
mov ecx, eax |
jecxz .ok |
mov dl, [esi] |
mov esi, [esp+32+8] |
.c2: |
lodsb |
lodsb |
@@: |
cmp al, 0xF |
jnz .f |
lodsb |
cmp al, 80h |
jb @b |
cmp al, 90h |
jb @f |
cmp al, 0xF |
jnz .f |
lodsb |
cmp al, 80h |
jb @b |
cmp al, 90h |
jb @f |
.f: |
sub al, 0E8h |
cmp al, 1 |
ja .c2 |
sub al, 0E8h |
cmp al, 1 |
ja .c2 |
@@: |
cmp byte [esi], dl |
jnz .c2 |
lodsd |
shr ax, 8 |
ror eax, 16 |
xchg al, ah |
sub eax, esi |
add eax, [esp+32+8] |
mov [esi-4], eax |
loop .c2 |
jmp .ok |
cmp byte [esi], dl |
jnz .c2 |
lodsd |
shr ax, 8 |
ror eax, 16 |
xchg al, ah |
sub eax, esi |
add eax, [esp+32+8] |
mov [esi-4], eax |
loop .c2 |
jmp .ok |
.lzma_unpack: |
98,22 → 98,22 |
.lp = 0 ; literal pos state bits |
.lc = 3 ; literal context bits |
.posStateMask = ((1 shl .pb)-1) |
.literalPosMask = ((1 shl .lp)-1) |
.literalPosMask = ((1 shl .lp)-1) |
.kNumPosBitsMax = 4 |
.kNumPosBitsMax = 4 |
.kNumPosStatesMax = (1 shl .kNumPosBitsMax) |
.kLenNumLowBits = 3 |
.kLenNumLowSymbols = (1 shl .kLenNumLowBits) |
.kLenNumMidBits = 3 |
.kLenNumMidSymbols = (1 shl .kLenNumMidBits) |
.kLenNumHighBits = 8 |
.kLenNumHighSymbols = (1 shl .kLenNumHighBits) |
.kLenNumLowBits = 3 |
.kLenNumLowSymbols = (1 shl .kLenNumLowBits) |
.kLenNumMidBits = 3 |
.kLenNumMidSymbols = (1 shl .kLenNumMidBits) |
.kLenNumHighBits = 8 |
.kLenNumHighSymbols = (1 shl .kLenNumHighBits) |
.LenChoice = 0 |
.LenChoice2 = 1 |
.LenLow = 2 |
.LenMid = (.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits)) |
.LenLow = 2 |
.LenMid = (.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits)) |
.LenHigh = (.LenMid + (.kNumPosStatesMax shl .kLenNumMidBits)) |
.kNumLenProbs = (.LenHigh + .kLenNumHighSymbols) |
136,12 → 136,12 |
.IsRep0Long = (.IsRepG2 + .kNumStates) |
.PosSlot = (.IsRep0Long + (.kNumStates shl .kNumPosBitsMax)) |
.SpecPos = (.PosSlot + (.kNumLenToPosStates shl .kNumPosSlotBits)) |
.Align_ = (.SpecPos + .kNumFullDistances - .kEndPosModelIndex) |
.Align_ = (.SpecPos + .kNumFullDistances - .kEndPosModelIndex) |
.Lencoder = (.Align_ + .kAlignTableSize) |
.RepLencoder = (.Lencoder + .kNumLenProbs) |
.Literal = (.RepLencoder + .kNumLenProbs) |
.LZMA_BASE_SIZE = 1846 ; must be ==Literal |
.LZMA_BASE_SIZE = 1846 ; must be ==Literal |
.LZMA_LIT_SIZE = 768 |
.kNumTopBits = 24 |
148,10 → 148,10 |
.kTopValue = (1 shl .kNumTopBits) |
.kNumBitModelTotalBits = 11 |
.kBitModelTotal = (1 shl .kNumBitModelTotalBits) |
.kBitModelTotal = (1 shl .kNumBitModelTotalBits) |
.kNumMoveBits = 5 |
push edi |
push edi |
; int state=0; |
xor ebx, ebx |
mov [.previousByte], bl |
173,7 → 173,7 |
; rd->Buffer = stream |
; rd->BufferLim = stream+bufferSize |
; rd->Range = 0xFFFFFFFF |
pop edi |
pop edi |
mov ebp, [esi-8] ; dest_length |
add ebp, edi ; ebp = destination limit |
lodsd |
515,7 → 515,8 |
uglobal |
align 4 |
;unpack.p rd unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp)) |
diff16 "unpacker.inc structures", 0, $ |
;unpack.p rd unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp)) |
unpack.p dd ? |
unpack.code_ dd ? |
unpack.range dd ? |