Files
TempleOS-Rijn/LT/OSMain/MEM.ASZ
T
2018-09-08 21:45:17 +02:00

289 lines
5.4 KiB
Plaintext

//The heap cache technique I first saw at Ticketmaster.
//I don't know who owns it.
ALIGN 8,0x90
INIT_MEM::
MOV U4 [MEM_FREE_LIST],0
MOV EBX,U4 [SYS_HEAP_BASE]
MOV EAX,U4 [SYS_MEMBLKS]
DEC EAX
MOV U4 [SYS_HEAP_LIMIT],EAX
INC EAX
SUB EAX,EBX
SHR EAX,PAGE_BITS
MOV EDI,U4 [MEM_FREE_LIST]
MOV U4 MB_NEXT[EBX],EDI
MOV U4 [MEM_FREE_LIST],EBX
MOV U4 MB_SIZE[EBX],EAX
RET
////**************************PROCEDURE*************************
// IN: EAX=NUM PAGES
// EDX=Tss
//
// OUT: ESI=BASE ADDRESS
// EAX=Pages allocated
//
ALIGN 8,0x90
ALLOCATE_MEM_BLKS::
PUSH EBX
PUSH ECX
PUSH EDI
PUSHFD
CLI
CMP EAX,FREE_PAGE_HASH_SIZE
JGE @@10
MOV ESI,U4 FREE_PAGE_HASH[EAX*4]
OR ESI,ESI
JZ @@200
MOV ECX,U4 MB_NEXT[ESI]
MOV U4 FREE_PAGE_HASH[EAX*4],ECX
JMP @@205
@@10: BSR ECX,EAX
CMP U4 ROUND_UP_TABLE-4[ECX*4],EAX
JE @@15
MOV EAX,U4 ROUND_UP_TABLE[ECX*4]
MOV ESI,U4 FREE_PAGE_HASH2[ECX*4]
OR ESI,ESI
JZ @@200
MOV EBX,U4 MB_NEXT[ESI]
MOV U4 FREE_PAGE_HASH2[ECX*4],EBX
JMP @@205
@@15: MOV ESI,U4 FREE_PAGE_HASH2-4[ECX*4]
OR ESI,ESI
JZ @@200
MOV EBX,U4 MB_NEXT[ESI]
MOV U4 FREE_PAGE_HASH2-4[ECX*4],EBX
JMP @@205
@@200: MOV ESI,MEM_FREE_LIST
@@201: LEA EBX,U4 MB_NEXT[ESI]
MOV ESI,U4 [EBX]
OR ESI,ESI
JZ @@300 //TODO: Out of mem
CMP U4 MB_SIZE[ESI],EAX
JB @@201
JNE @@203
MOV EDI,U4 MB_NEXT[ESI]
MOV U4 MB_NEXT[EBX],EDI
JMP @@205
@@203: SUB U4 MB_SIZE[ESI],EAX //UPDATE FREE ENTRY
MOV EDI,U4 MB_SIZE[ESI]
SHL EDI,PAGE_BITS
ADD ESI,EDI //SET ESI TO @ALLOCATED PAGES
@@210: MOV U4 MB_SIZE[ESI],EAX
@@205: MOV EDI,U4 TSS_LAST_MEM_BLK[EDX]
CALL INSQUE
@@300: POPFD
POP EDI
POP ECX
POP EBX
RET
////**************************PROCEDURE*************************
// IN: ESI=BASE ADDRESS
ALIGN 8,0x90
FREE_MEM_BLKS::
OR ESI,ESI
JZ @@100
PUSH EAX
PUSH EBX
PUSH ECX
PUSHFD
CLI
CALL REMQUE
MOV EAX,MB_SIZE[ESI]
CMP EAX,FREE_PAGE_HASH_SIZE
JGE @@5
MOV EBX,U4 FREE_PAGE_HASH[EAX*4]
MOV U4 MB_NEXT[ESI],EBX
MOV U4 FREE_PAGE_HASH[EAX*4],ESI
JMP @@101
@@5: BSR ECX,EAX
MOV EBX,U4 FREE_PAGE_HASH2-4[ECX*4]
MOV U4 MB_NEXT[ESI],EBX
MOV U4 FREE_PAGE_HASH2-4[ECX*4],ESI
@@101: POPFD
POP ECX
POP EBX
POP EAX
@@100: RET
////**************************PROCEDURE*************************
ALIGN 8,0x90
FREE_MEM_BLK_LIST::
PUSH EDX
MOV EDX,FS:[TSS_ABSOLUTE_ADDRESS]
PUSH ESI
PUSH EDI
PUSHFD
CLI
MOV EDI,EDX
ADD EDI,TSS_NEXT_MEM_BLK
@@1: MOV ESI,U4 MB_NEXT[EDI]
CMP ESI,EDI
JE @@100
CALL FREE_MEM_BLKS
JMP @@1
@@100: POPFD
POP EDI
POP ESI
POP EDX
RET
////**************************PROCEDURE*************************
// IN: EAX=NUM U1S
// OUT: ESI=BASE ADDRESS
//
ALIGN 8,0x90
ROUND_UP_TABLE:
DU4 2,4,8,16,32,64,128,256,512,1024,2048,4096,8192;
DU4 0x4000,0x8000,0x10000,0x20000,0x40000,0x80000;
DU4 0x100000,0x200000,0x400000,0x800000,0x1000000;
DU4 0x2000000,0x4000000,0x8000000,0x10000000;
DU4 0x20000000,0x40000000,0x80000000;
ALIGN 8,0x90
CP_MALLOC::
PUSH EBP
MOV EBP,ESP
PUSH ESI
PUSH EDI
MOV EAX,SF_PARAM1[EBP]
MOV EDX,SF_PARAM2[EBP]
OR EDX,EDX
JNZ @@30
MOV EDX,U4 FS:[TSS_ABSOLUTE_ADDRESS]
@@30: PUSHFD
CLI
ADD EAX,7
AND EAX,0xFFFFFFFC
CMP EAX,UUM_STRUCT_SIZE
JGE @@4
MOV EAX,UUM_STRUCT_SIZE
@@4: CMP EAX,HEAP_HASH_SIZE
JGE @@10
MOV ESI,U4 TSS_HEAP_HASH[EAX+EDX]
OR ESI,ESI
JZ @@13
MOV ECX,U4 UUM_NEXT[ESI]
MOV U4 TSS_HEAP_HASH[EAX+EDX],ECX
JMP U4 @@5
@@10: ADD EAX,MB_STRUCT_SIZE+PAGE_SIZE-1
SHR EAX,PAGE_BITS
CALL ALLOCATE_MEM_BLKS
SHL EAX,PAGE_BITS
SUB EAX,MB_STRUCT_SIZE
ADD ESI,MB_STRUCT_SIZE
JMP @@5
@@13: MOV ESI,EDX
ADD ESI,TSS_MALLOC_FREE_LIST
@@1: LEA EBX,U4 UUM_NEXT[ESI]
MOV ESI,U4 [EBX]
OR ESI,ESI
JNZ @@2
PUSH EAX //-****
ADD EAX,64*PAGE_SIZE-1
SHR EAX,PAGE_BITS
CALL ALLOCATE_MEM_BLKS
LEA ESI,U4 MB_STRUCT_SIZE[ESI]
SHL EAX,PAGE_BITS
SUB EAX,MB_STRUCT_SIZE
MOV EDI,U4 TSS_MALLOC_FREE_LIST[EDX]
MOV U4 UUM_NEXT[ESI],EDI
MOV U4 UUM_SIZE[ESI],EAX
MOV U4 TSS_MALLOC_FREE_LIST[EDX],ESI
MOV EBX,EDX
ADD EBX,TSS_MALLOC_FREE_LIST
POP EAX //+****
JMP @@3
@@2: CMP U4 UUM_SIZE[ESI],EAX
JL @@1
JNE @@3
@@8: MOV EDI,U4 UUM_NEXT[ESI]
MOV U4 UUM_NEXT[EBX],EDI
JMP @@5
@@3: SUB U4 UUM_SIZE[ESI],EAX //UPDATE FREE ENTRY
CMP U4 UUM_SIZE[ESI],UUM_STRUCT_SIZE
JAE @@7
ADD U4 UUM_SIZE[ESI],EAX
MOV EAX,U4 UUM_SIZE[ESI]
JMP @@8
@@7: MOV EDI,U4 UUM_SIZE[ESI]
ADD ESI,EDI //SET ESI TO @ALLOCATED PAGES
@@5: MOV U4 [ESI],EAX
ADD ESI,4
@@100: POPFD
MOV EAX,ESI
XOR EDX,EDX
POP EDI
POP ESI
POP EBP
RET
////**************************PROCEDURE*************************
// IN: ESI=BASE ADDRESS
ALIGN 8,0x90
CP_FREE::
PUSH EBP
MOV EBP,ESP
PUSH ESI
PUSH EDI
MOV ESI,SF_PARAM1[EBP]
OR ESI,ESI
JZ @@100
MOV EDX,SF_PARAM2[EBP]
OR EDX,EDX
JNZ @@30
MOV EDX,U4 FS:[TSS_ABSOLUTE_ADDRESS]
@@30: PUSHFD
CLI
SUB ESI,4
MOV EAX,U4 [ESI] //USED_USER_MEM_SIZE
CMP EAX,HEAP_HASH_SIZE
JGE @@5
MOV UUM_SIZE[ESI],EAX
MOV EBX,U4 TSS_HEAP_HASH[EAX+EDX]
MOV U4 UUM_NEXT[ESI],EBX
MOV U4 TSS_HEAP_HASH[EAX+EDX],ESI
JMP @@101
@@5: SUB ESI,MB_STRUCT_SIZE
CALL FREE_MEM_BLKS
@@101: POPFD
@@100: POP EDI
POP ESI
POP EBP
RET
////**************************PROCEDURE*************************
CP_MSIZE::
PUSH EBP
MOV EBP,ESP
MOV EAX,SF_PARAM1[EBP]
OR EAX,EAX
JZ @@100
MOV EAX,U4 -4[EAX]
SUB EAX,4
@@100: XOR EDX,EDX
POP EBP
RET