TempleOSCDV4.03.ISO
This commit is contained in:
1 parent
1541d7328d
commit
0f1a4a5d65
115 files changed
+5618
-4863
No files matched your search
@@ -91,14 +91,10 @@ I64 DirEntryCompareCluster(CDirEntry *e1,CDirEntry *e2)
|
||||
|
||||
U0 DirFilesSort(CDirEntry **_tempde,I64 key)
|
||||
{
|
||||
I64 i,cnt=0;
|
||||
I64 i,cnt;
|
||||
CDirEntry *tempde=*_tempde,*tempde1,**sort_buf;
|
||||
if (tempde) {
|
||||
tempde1=tempde;
|
||||
while (tempde1) {
|
||||
cnt++;
|
||||
tempde1=tempde1->next;
|
||||
}
|
||||
cnt=LinkedLstCnt(tempde);
|
||||
if (cnt>1) {
|
||||
sort_buf=MAlloc(cnt*sizeof(U8 *));
|
||||
i=0;
|
||||
|
||||
+1
-7
@@ -1,7 +1,6 @@
|
||||
U0 SysGlblsInit()
|
||||
{
|
||||
I64 i,j;
|
||||
U8 *m;
|
||||
CRAXRBCRCXRDX ee;
|
||||
|
||||
CPUId(0x1,&ee);
|
||||
@@ -55,8 +54,6 @@ U0 SysGlblsInit()
|
||||
|
||||
//$AN,"Independent HeapCtrl Example",A="Independent HeapCtrl Example"$
|
||||
i=1; //Rqst 1 blk, we might get more.
|
||||
m=Mem2MegUncachedAlloc(&i,sys_code_bp);
|
||||
dev.uncached_heap=HeapCtrlBPInit(m,i*0x200000/0x200);
|
||||
QueInit(&dev.pci_root);
|
||||
dev.mem64_ptr=MEM_MAPPED_SPACE;
|
||||
|
||||
@@ -187,10 +184,7 @@ U0 KernelMain()
|
||||
KbdMouseVarsInit;
|
||||
IPVarsInit;
|
||||
KbdInit;
|
||||
if (mp_cnt<2)
|
||||
Spawn(&MouseDriverInstall);
|
||||
else
|
||||
Spawn(&MouseDriverInstall,,,1);
|
||||
Spawn(&MouseDriverInstall);
|
||||
|
||||
"Loading Compiler\n";
|
||||
Cd("/Compiler");
|
||||
|
||||
+4
-1
@@ -46,7 +46,10 @@ IRQ_TIMER:: //I_TIMER
|
||||
MOV U32 [RAX],0
|
||||
JMP @@25
|
||||
@@20: CALL &IntCore0TimerHandler //Only Core 0 calls this.
|
||||
@@25: JMP I32 RESTORE_RSI_TASK
|
||||
@@25: XOR RAX,RAX
|
||||
CMP RSI,U64 GS:CCPU.idle_task[RAX]
|
||||
JE I32 RESTORE_SETH_TASK_IF_READY
|
||||
JMP I32 RESTORE_RSI_TASK
|
||||
//************************************
|
||||
INT_FAULT::
|
||||
PUSH RBX
|
||||
|
||||
+4
-4
@@ -207,16 +207,16 @@ SYS_DATA_BP:: DU64 0;
|
||||
SYS_PROGRESSES::
|
||||
SYS_PROGRESS1:: DU64 0;
|
||||
SYS_PROGRESS1_MAX:: DU64 0;
|
||||
SYS_PROGRESS1_DESC:: DU8 PROGRESS_DESC_LEN+1 DUP(0);
|
||||
SYS_PROGRESS1_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
|
||||
SYS_PROGRESS2:: DU64 0;
|
||||
SYS_PROGRESS2_MAX:: DU64 0;
|
||||
SYS_PROGRESS2_DESC:: DU8 PROGRESS_DESC_LEN+1 DUP(0);
|
||||
SYS_PROGRESS2_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
|
||||
SYS_PROGRESS3:: DU64 0;
|
||||
SYS_PROGRESS3_MAX:: DU64 0;
|
||||
SYS_PROGRESS3_DESC:: DU8 PROGRESS_DESC_LEN+1 DUP(0);
|
||||
SYS_PROGRESS3_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
|
||||
SYS_PROGRESS4:: DU64 0;
|
||||
SYS_PROGRESS4_MAX:: DU64 0;
|
||||
SYS_PROGRESS4_DESC:: DU8 PROGRESS_DESC_LEN+1 DUP(0);
|
||||
SYS_PROGRESS4_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
|
||||
#assert $$-SYS_PROGRESSES==sizeof(CProgress)*4
|
||||
|
||||
SYS_FOCUS_TASK:: DU64 0;
|
||||
|
||||
+55
-48
@@ -152,8 +152,11 @@ I64 TaskInit(CTask *task,I64 stk_size)
|
||||
CTaskStk *temps;
|
||||
|
||||
QueInit(&task->code_heap->next_mem_blk);
|
||||
if (task->code_heap!=task->data_heap)
|
||||
task->code_heap->last_mergable=NULL;
|
||||
if (task->code_heap!=task->data_heap) {
|
||||
QueInit(&task->data_heap->next_mem_blk);
|
||||
task->data_heap->last_mergable=NULL;
|
||||
}
|
||||
|
||||
task->addr=task->next_task=task->last_task=
|
||||
task->next_input_filter_task=task->last_input_filter_task=
|
||||
@@ -233,7 +236,7 @@ CTask *Spawn(U0 (*fp_start_addr)(U8 *data),U8 *data=NULL,U8 *task_name=NULL,
|
||||
task->rsp(U8 *)-=8;
|
||||
*task->rsp=&Exit;
|
||||
task->hash_table->next=parent->hash_table;
|
||||
MemCpy(task->task_name,task_name,TASK_NAME_LEN+1);
|
||||
MemCpy(task->task_name,task_name,TASK_NAME_LEN);
|
||||
StrCpy(task->task_title,task->task_name);
|
||||
task->title_src=TTS_TASK_NAME;
|
||||
PUSHFD
|
||||
@@ -275,7 +278,7 @@ I64 ExeCmdLine(CCmpCtrl *cc)
|
||||
(cc->token!='}' || !(cc->flags & CCF_EXE_BLK)) ) {
|
||||
if (Fs->title_src==TTS_CUR_LEX) {
|
||||
ptr2=&Fs->task_title;
|
||||
ptr3=ptr2+TASK_TITLE_LEN;
|
||||
ptr3=ptr2+STR_LEN-1;
|
||||
if (cc->lex_include_stk->flags & LFSF_DOC) {
|
||||
doc_e=cc->lex_include_stk->cur_entry;
|
||||
doc=cc->lex_include_stk->doc;
|
||||
@@ -296,7 +299,7 @@ I64 ExeCmdLine(CCmpCtrl *cc)
|
||||
if (ptr2<ptr3) *ptr2=0;
|
||||
} else
|
||||
if ((ptr=cc->lex_include_stk->line_start) && *ptr)
|
||||
MemCpy(ptr2,ptr,TASK_TITLE_LEN);
|
||||
MemCpy(ptr2,ptr,STR_LEN-1);
|
||||
}
|
||||
cc->flags&=~CCF_HAS_MISC_DATA;
|
||||
machine_code=LexStmt2Bin(cc,&type);
|
||||
@@ -328,6 +331,22 @@ I64 ExeCmdLine(CCmpCtrl *cc)
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 SrvTaskCont()
|
||||
{//Act as server task in a loop handling commands.
|
||||
I64 old_flags=GetRFlags;
|
||||
FlushMsgs;
|
||||
while (TRUE) {
|
||||
CLI
|
||||
if (SrvCmdsHandler(old_flags) && Fs->title_src==TTS_TASK_NAME)
|
||||
MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN);
|
||||
FlushMsgs;
|
||||
LBts(&Fs->task_flags,TASKf_IDLE);
|
||||
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
|
||||
Yield;
|
||||
SetRFlags(old_flags);
|
||||
}
|
||||
}
|
||||
|
||||
U0 UserTaskCont()
|
||||
{//Terminal key-input-execute loop.
|
||||
CCmpCtrl *cc;
|
||||
@@ -350,6 +369,15 @@ U0 UserTaskCont()
|
||||
} while (cont);
|
||||
}
|
||||
|
||||
U0 SrvCmdLine(I64 dummy=0)
|
||||
{
|
||||
nounusedwarn dummy;
|
||||
Fs->win_inhibit=WIG_USER_TASK_DFT;
|
||||
if (HashFind("SrvStartUp",adam_task->hash_table,HTT_FUN))
|
||||
CallExtStr("SrvStartUp");
|
||||
SrvTaskCont;
|
||||
}
|
||||
|
||||
U0 UserCmdLine(I64 dummy=0)
|
||||
{//A user task ends-up calling this.
|
||||
nounusedwarn dummy;
|
||||
@@ -374,32 +402,7 @@ CTask *User(U8 *fmt=NULL,...)
|
||||
return task;
|
||||
}
|
||||
|
||||
U0 SrvTaskCont()
|
||||
{//Act as server task in a loop handling commands.
|
||||
I64 old_flags=GetRFlags;
|
||||
FlushMsgs;
|
||||
while (TRUE) {
|
||||
CLI
|
||||
if (SrvCmdsHandler(old_flags) && Fs->title_src==TTS_TASK_NAME)
|
||||
MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN+1);
|
||||
FlushMsgs;
|
||||
LBts(&Fs->task_flags,TASKf_IDLE);
|
||||
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
|
||||
Yield;
|
||||
SetRFlags(old_flags);
|
||||
}
|
||||
}
|
||||
|
||||
U0 SrvCmdLine(I64 dummy=0)
|
||||
{
|
||||
nounusedwarn dummy;
|
||||
Fs->win_inhibit=WIG_USER_TASK_DFT;
|
||||
if (HashFind("SrvStartUp",adam_task->hash_table,HTT_FUN))
|
||||
CallExtStr("SrvStartUp");
|
||||
SrvTaskCont;
|
||||
}
|
||||
|
||||
U0 TaskFinishOff(CTask *task)
|
||||
U0 TaskDel(CTask *task)
|
||||
{//We delay freeing in case lingering ptr to reincarnated.
|
||||
HeapCtrlDel(task->code_heap);
|
||||
if (task->data_heap!=task->code_heap)
|
||||
@@ -481,26 +484,30 @@ I64 TaskEnd()
|
||||
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
|
||||
LBtr(&task->task_flags,TASKf_TASK_LOCK);
|
||||
|
||||
if (sys_winmgr_task) {
|
||||
task->next_task=Gs->dying_task_lst;
|
||||
Gs->dying_task_lst=task;
|
||||
} else
|
||||
TaskFinishOff(task); //dangerous (stk in use)
|
||||
//Never happens--winmgr exists except during boot and no tasks die during boot
|
||||
//currently, though this has been different and might be different in
|
||||
//future. Would have to be multicore task getting this task's memory
|
||||
//because IRQs are off, so no tasks on this core run.
|
||||
task->wake_jiffy=cnts.jiffies+DYING_JIFFIES;
|
||||
while (LBts(&Gs->cpu_flags,CPUf_DYING_TASK_QUE))
|
||||
PAUSE
|
||||
QueIns(task,Gs->last_dying);
|
||||
LBtr(&Gs->cpu_flags,CPUf_DYING_TASK_QUE);
|
||||
|
||||
return tempt;
|
||||
}
|
||||
|
||||
U0 TaskFinishOffDying()
|
||||
{//Called by Seth tasks. Delay freeing in case lingering ptr to reincarnated.
|
||||
CTask *task1,*task2;
|
||||
if (task1=XchgI64(&Gs->dying_task_lst,NULL)) {
|
||||
do {
|
||||
task2=task1->next_task;
|
||||
TaskFinishOff(task1);
|
||||
task1=task2;
|
||||
} while (task1);
|
||||
U0 TaskKillDying()
|
||||
{//Delay freeing to prevent asking for trouble with quick reincarnations.
|
||||
//What if the user is doing this: $LK,"DoTreeCheckers",A="FF:::/Misc/OSTestSuite.CPP,DoTreeCheckers"$.
|
||||
CTaskDying *task,*task1;
|
||||
if (Gs->kill_jiffy<cnts.jiffies) {//Avoid doing as many lock operations.
|
||||
while (LBts(&Gs->cpu_flags,CPUf_DYING_TASK_QUE))
|
||||
PAUSE
|
||||
task=Gs->next_dying;
|
||||
while (task!=&Gs->next_dying && task->wake_jiffy<cnts.jiffies) {
|
||||
task1=task->next;
|
||||
QueRem(task);
|
||||
TaskDel(task);
|
||||
task=task1;
|
||||
}
|
||||
LBtr(&Gs->cpu_flags,CPUf_DYING_TASK_QUE);
|
||||
Gs->kill_jiffy=cnts.jiffies+DYING_JIFFIES;
|
||||
}
|
||||
}
|
||||
+2221
-2204
File diff suppressed because it is too large.
Load diff
+196
-167
@@ -447,7 +447,8 @@ class CKernel
|
||||
#define RLf_WINMGR 13
|
||||
#define RLf_REGISTRY 14
|
||||
#define RLf_HOME 15
|
||||
#define RLf_ADAM_SERVER 16
|
||||
#define RLf_AUTO_COMPLETE 16
|
||||
#define RLf_ADAM_SERVER 17
|
||||
|
||||
#define RLF_16BIT 0x00001
|
||||
#define RLF_VGA 0x00002
|
||||
@@ -465,7 +466,8 @@ class CKernel
|
||||
#define RLF_WINMGR 0x02000
|
||||
#define RLF_REGISTRY 0x04000
|
||||
#define RLF_HOME 0x08000
|
||||
#define RLF_ADAM_SERVER 0x10000
|
||||
#define RLF_AUTO_COMPLETE 0x10000
|
||||
#define RLF_ADAM_SERVER 0x20000
|
||||
|
||||
#help_index "Processor"
|
||||
#define LAPIC_BASE 0xFEE00000
|
||||
@@ -951,36 +953,31 @@ public class CHashGlblVar:CHashSrcSym
|
||||
DOCF_PLAIN_TEXT_TABS|DOCF_MIN_SIZE|DOCF_NO_CURSOR|\
|
||||
DOCF_FORM|DOCF_DBL_DOLLARS|DOCF_DONT_SWAP_OUT|\
|
||||
DOCF_DO_FULL_REFRESH|DOCF_BORDER_DOC|DOCF_HIDE_CURSOR|\
|
||||
DOCF_CARRIAGE_RETURN)
|
||||
DOCF_DONT_HIGHLIGHT_CURSOR|DOCF_CARRIAGE_RETURN)
|
||||
|
||||
//CDocEntry.de_flags. These first 15 are arg=
|
||||
//CDocEntry.de_flags. These first 16 are arg=
|
||||
#define DOCEF_TAG 1
|
||||
#define DOCEF_AUX_STR 2
|
||||
#define DOCEF_DEFINE 4
|
||||
#define DOCEF_HTML_LINK 8
|
||||
#define DOCEF_LEFT_EXP 0x10
|
||||
#define DOCEF_LEFT_MACRO 0x20
|
||||
#define DOCEF_RIGHT_EXP 0x40
|
||||
#define DOCEF_RIGHT_MACRO 0x80
|
||||
#define DOCEF_HAS_BIN 0x100
|
||||
#define DOCEF_BIN_PTR_LINK 0x200
|
||||
#define DOCEF_RAW_TYPE 0x400
|
||||
#define DOCEF_SHIFTED_X 0x800
|
||||
#define DOCEF_SHIFTED_Y 0x1000
|
||||
#define DOCEF_SCROLLING_X 0x2000
|
||||
#define DOCEF_USER_DATA 0x4000
|
||||
|
||||
#define DOCEG1_HAS_ARG (DOCEF_TAG|DOCEF_AUX_STR|DOCEF_DEFINE|\
|
||||
DOCEF_HTML_LINK|DOCEF_LEFT_EXP|DOCEF_LEFT_MACRO|DOCEF_RIGHT_EXP|\
|
||||
DOCEF_RIGHT_MACRO|DOCEF_HAS_BIN|DOCEF_BIN_PTR_LINK|DOCEF_RAW_TYPE|\
|
||||
DOCEF_SHIFTED_X|DOCEF_SHIFTED_Y|DOCEF_SCROLLING_X|DOCEF_USER_DATA)\
|
||||
#define DOCEF_LEN 2
|
||||
#define DOCEF_AUX_STR 4
|
||||
#define DOCEF_DEFINE 8
|
||||
#define DOCEF_HTML_LINK 0x10
|
||||
#define DOCEF_LEFT_EXP 0x20
|
||||
#define DOCEF_LEFT_MACRO 0x40
|
||||
#define DOCEF_RIGHT_EXP 0x80
|
||||
#define DOCEF_RIGHT_MACRO 0x100
|
||||
#define DOCEF_HAS_BIN 0x200
|
||||
#define DOCEF_BIN_PTR_LINK 0x400
|
||||
#define DOCEF_RAW_TYPE 0x800
|
||||
#define DOCEF_SHIFTED_X 0x1000
|
||||
#define DOCEF_SHIFTED_Y 0x2000
|
||||
#define DOCEF_SCROLLING_X 0x4000
|
||||
#define DOCEF_USER_DATA 0x8000
|
||||
|
||||
//CDocEntry.de_flags. These are +/- flags
|
||||
#define DOCEF_LEFT_CB 0x8000
|
||||
#define DOCEF_LEFT_AUTO 0x10000
|
||||
#define DOCEF_RIGHT_CB 0x20000
|
||||
#define DOCEF_RIGHT_AUTO 0x40000
|
||||
#define DOCEF_TAG_CB 0x80000
|
||||
#define DOCEF_LEFT_CB 0x10000
|
||||
#define DOCEF_LEFT_AUTO 0x20000
|
||||
#define DOCEF_RIGHT_CB 0x40000
|
||||
#define DOCEF_RIGHT_AUTO 0x80000
|
||||
#define DOCEF_LEFT_X 0x100000
|
||||
#define DOCEF_CENTER_X 0x200000
|
||||
#define DOCEF_RIGHT_X 0x400000
|
||||
@@ -988,34 +985,46 @@ public class CHashGlblVar:CHashSrcSym
|
||||
#define DOCEF_CENTER_Y 0x1000000
|
||||
#define DOCEF_BOTTOM_Y 0x2000000
|
||||
//HL...UL
|
||||
#define DOCEF_PAGE_REL_Y 0x100000000
|
||||
#define DOCEF_MARGIN_REL_X 0x200000000
|
||||
#define DOCEF_WIN_REL 0x400000000
|
||||
#define DOCEF_LINK 0x800000000
|
||||
#define DOCEF_ESC 0x1000000000 //Send <ESC> (Exit and Save)
|
||||
#define DOCEF_QUIT 0x2000000000 //Send <SHIFT-ESC> (Abort)
|
||||
#define DOCEF_FROM_START 0x4000000000
|
||||
#define DOCEF_HAS_BORDER 0x8000000000
|
||||
#define DOCEF_SOLID_BORDER 0x10000000000
|
||||
#define DOCEF_BORDER_PLOT 0x20000000000
|
||||
#define DOCEF_CHECKED_COLLAPSED 0x40000000000 //Checked or Collapsed
|
||||
#define DOCEF_CHECK_COLLAPSABLE 0x80000000000
|
||||
#define DOCEF_REFRESH_DATA 0x100000000000
|
||||
#define DOCEF_UPDATE_DATA 0x200000000000
|
||||
#define DOCEF_DATA_IS_PTR 0x400000000000
|
||||
#define DOCEF_HAS_TERMINATOR 0x800000000000
|
||||
#define DOCEF_ZERO_BASED 0x1000000000000
|
||||
#define DOCEF_HOLD 0x2000000000000
|
||||
#define DOCEF_TREE 0x4000000000000
|
||||
#define DOCEF_LST 0x8000000000000
|
||||
#define DOCEF_SKIP 0x10000000000000
|
||||
#define DOCEF_POPUP 0x20000000000000
|
||||
#define DOCEF_SKIP_IN_FORM 0x40000000000000
|
||||
#define DOCEF_FILTER_SKIP 0x80000000000000
|
||||
#define DOCEF_NO_CLICK_ON 0x100000000000000
|
||||
#define DOCEF_DONT_DRAW 0x200000000000000 //only works on sprites
|
||||
#define DOCEF_TAG_CB 0x100000000
|
||||
#define DOCEF_PAGE_REL_Y 0x200000000
|
||||
#define DOCEF_MARGIN_REL_X 0x400000000
|
||||
#define DOCEF_WIN_REL 0x800000000
|
||||
#define DOCEF_LINK 0x1000000000
|
||||
#define DOCEF_ESC 0x2000000000 //Send <ESC> (Exit and Save)
|
||||
#define DOCEF_QUIT 0x4000000000 //Send <SHIFT-ESC> (Abort)
|
||||
#define DOCEF_FROM_START 0x8000000000
|
||||
#define DOCEF_HAS_BORDER 0x10000000000
|
||||
#define DOCEF_SOLID_BORDER 0x20000000000
|
||||
#define DOCEF_BORDER_PLOT 0x40000000000
|
||||
#define DOCEF_CHECKED_COLLAPSED 0x80000000000 //Checked or Collapsed
|
||||
#define DOCEF_CHECK_COLLAPSABLE 0x100000000000
|
||||
#define DOCEF_REFRESH_DATA 0x200000000000
|
||||
#define DOCEF_UPDATE_DATA 0x400000000000
|
||||
//$LK,"DOCEF_DEREF_DATA",A="MN:DOCEF_DEREF_DATA"$ is confusing. $LK,"DocForm",A="MN:DocForm"$() makes doc_e->data point to members
|
||||
//of class. For ints, it derefs doc_e->data as a ptr. For strings, it doesn't.
|
||||
#define DOCEF_DEREF_DATA 0x800000000000
|
||||
#define DOCEF_REMALLOC_DATA 0x1000000000000
|
||||
#define DOCEF_HAS_TERMINATOR 0x2000000000000
|
||||
#define DOCEF_ZERO_BASED 0x4000000000000
|
||||
#define DOCEF_HOLD 0x8000000000000
|
||||
#define DOCEF_TREE 0x10000000000000
|
||||
#define DOCEF_LST 0x20000000000000
|
||||
#define DOCEF_SKIP 0x40000000000000
|
||||
#define DOCEF_POPUP 0x80000000000000
|
||||
#define DOCEF_SKIP_IN_FORM 0x100000000000000
|
||||
#define DOCEF_FILTER_SKIP 0x200000000000000
|
||||
#define DOCEF_NO_CLICK_ON 0x400000000000000
|
||||
#define DOCEF_DONT_DRAW 0x800000000000000 //only works on sprites
|
||||
|
||||
#define DOCEG1_DONT_EDIT (DOCEF_DEFINE|DOCEF_HTML_LINK|\
|
||||
#define DOCEG_HAS_ALLOC (DOCEF_TAG|DOCEF_AUX_STR|DOCEF_DEFINE|\
|
||||
DOCEF_HTML_LINK|DOCEF_LEFT_MACRO|DOCEF_RIGHT_MACRO|DOCEF_BIN_PTR_LINK|\
|
||||
DOCEF_REMALLOC_DATA)
|
||||
|
||||
#define DOCEG_HAS_ARG ((DOCEG_HAS_ALLOC&~DOCEF_REMALLOC_DATA)|\
|
||||
DOCEF_LEN|DOCEF_LEFT_EXP|DOCEF_RIGHT_EXP|DOCEF_HAS_BIN|DOCEF_RAW_TYPE|\
|
||||
DOCEF_SHIFTED_X|DOCEF_SHIFTED_Y|DOCEF_SCROLLING_X|DOCEF_USER_DATA)
|
||||
|
||||
#define DOCEG_DONT_EDIT (DOCEF_DEFINE|DOCEF_HTML_LINK|\
|
||||
DOCEF_AUX_STR|DOCEF_BIN_PTR_LINK|DOCEF_SCROLLING_X|DOCEF_TAG_CB)
|
||||
|
||||
//These are identical to Doc flags
|
||||
@@ -1032,29 +1041,29 @@ public class CHashGlblVar:CHashSrcSym
|
||||
#define DOCEf_SELECTED ATTRf_SELECTED
|
||||
#define DOCEf_UNDERLINE ATTRf_UNDERLINE
|
||||
|
||||
//CDocEntry.de_flags. These first 15 are arg=
|
||||
//CDocEntry.de_flags. These first 16 are arg=
|
||||
#define DOCEf_TAG 0
|
||||
#define DOCEf_AUX_STR 1
|
||||
#define DOCEf_DEFINE 2
|
||||
#define DOCEf_HTML_LINK 3
|
||||
#define DOCEf_LEFT_EXP 4
|
||||
#define DOCEf_LEFT_MACRO 5
|
||||
#define DOCEf_RIGHT_EXP 6
|
||||
#define DOCEf_RIGHT_MACRO 7
|
||||
#define DOCEf_HAS_BIN 8
|
||||
#define DOCEf_BIN_PTR_LINK 9
|
||||
#define DOCEf_RAW_TYPE 10
|
||||
#define DOCEf_SHIFTED_X 11
|
||||
#define DOCEf_SHIFTED_Y 12
|
||||
#define DOCEf_SCROLLING_X 13
|
||||
#define DOCEf_USER_DATA 14
|
||||
#define DOCEf_LEN 1
|
||||
#define DOCEf_AUX_STR 2
|
||||
#define DOCEf_DEFINE 3
|
||||
#define DOCEf_HTML_LINK 4
|
||||
#define DOCEf_LEFT_EXP 5
|
||||
#define DOCEf_LEFT_MACRO 6
|
||||
#define DOCEf_RIGHT_EXP 7
|
||||
#define DOCEf_RIGHT_MACRO 8
|
||||
#define DOCEf_HAS_BIN 9
|
||||
#define DOCEf_BIN_PTR_LINK 10
|
||||
#define DOCEf_RAW_TYPE 11
|
||||
#define DOCEf_SHIFTED_X 12
|
||||
#define DOCEf_SHIFTED_Y 13
|
||||
#define DOCEf_SCROLLING_X 14
|
||||
#define DOCEf_USER_DATA 15
|
||||
|
||||
//CDocEntry.de_flags. These are +/- flags
|
||||
#define DOCEf_LEFT_CB 15
|
||||
#define DOCEf_LEFT_AUTO 16
|
||||
#define DOCEf_RIGHT_CB 17
|
||||
#define DOCEf_RIGHT_AUTO 18
|
||||
#define DOCEf_TAG_CB 19
|
||||
#define DOCEf_LEFT_CB 16
|
||||
#define DOCEf_LEFT_AUTO 17
|
||||
#define DOCEf_RIGHT_CB 18
|
||||
#define DOCEf_RIGHT_AUTO 19
|
||||
#define DOCEf_LEFT_X 20
|
||||
#define DOCEf_CENTER_X 21
|
||||
#define DOCEf_RIGHT_X 22
|
||||
@@ -1062,33 +1071,35 @@ public class CHashGlblVar:CHashSrcSym
|
||||
#define DOCEf_CENTER_Y 24
|
||||
#define DOCEf_BOTTOM_Y 25
|
||||
//HL...UL
|
||||
#define DOCEf_PAGE_REL_Y 32
|
||||
#define DOCEf_MARGIN_REL_X 33
|
||||
#define DOCEf_WIN_REL 34
|
||||
#define DOCEf_LINK 35
|
||||
#define DOCEf_ESC 36 //Send <ESC> (Exit and Save)
|
||||
#define DOCEf_QUIT 37 //Send <SHIFT-ESC> (Abort)
|
||||
#define DOCEf_FROM_START 38
|
||||
#define DOCEf_HAS_BORDER 39
|
||||
#define DOCEf_SOLID_BORDER 40
|
||||
#define DOCEf_BORDER_PLOT 41
|
||||
#define DOCEf_CHECKED_COLLAPSED 42 //Checked or Collapsed
|
||||
#define DOCEf_CHECK_COLLAPSABLE 43
|
||||
#define DOCEf_REFRESH_DATA 44
|
||||
#define DOCEf_UPDATE_DATA 45
|
||||
#define DOCEf_DATA_IS_PTR 46
|
||||
#define DOCEf_HAS_TERMINATOR 47
|
||||
#define DOCEf_ZERO_BASED 48
|
||||
#define DOCEf_HOLD 49
|
||||
#define DOCEf_TREE 50
|
||||
#define DOCEf_LST 51
|
||||
#define DOCEf_SKIP 52
|
||||
#define DOCEf_POPUP 53
|
||||
#define DOCEf_SKIP_IN_FORM 54
|
||||
#define DOCEf_FILTER_SKIP 55
|
||||
#define DOCEf_NO_CLICK_ON 56
|
||||
#define DOCEf_DONT_DRAW 57 //only works on sprites
|
||||
#define DOCEf_NUM_FLAGS 58
|
||||
#define DOCEf_TAG_CB 32
|
||||
#define DOCEf_PAGE_REL_Y 33
|
||||
#define DOCEf_MARGIN_REL_X 34
|
||||
#define DOCEf_WIN_REL 35
|
||||
#define DOCEf_LINK 36
|
||||
#define DOCEf_ESC 37 //Send <ESC> (Exit and Save)
|
||||
#define DOCEf_QUIT 38 //Send <SHIFT-ESC> (Abort)
|
||||
#define DOCEf_FROM_START 39
|
||||
#define DOCEf_HAS_BORDER 40
|
||||
#define DOCEf_SOLID_BORDER 41
|
||||
#define DOCEf_BORDER_PLOT 42
|
||||
#define DOCEf_CHECKED_COLLAPSED 43 //Checked or Collapsed
|
||||
#define DOCEf_CHECK_COLLAPSABLE 44
|
||||
#define DOCEf_REFRESH_DATA 45
|
||||
#define DOCEf_UPDATE_DATA 46
|
||||
#define DOCEf_DEREF_DATA 47
|
||||
#define DOCEf_REMALLOC_DATA 48
|
||||
#define DOCEf_HAS_TERMINATOR 49
|
||||
#define DOCEf_ZERO_BASED 50
|
||||
#define DOCEf_HOLD 51
|
||||
#define DOCEf_TREE 52
|
||||
#define DOCEf_LST 53
|
||||
#define DOCEf_SKIP 54
|
||||
#define DOCEf_POPUP 55
|
||||
#define DOCEf_SKIP_IN_FORM 56
|
||||
#define DOCEf_FILTER_SKIP 57
|
||||
#define DOCEf_NO_CLICK_ON 58
|
||||
#define DOCEf_DONT_DRAW 59 //only works on sprites
|
||||
#define DOCEf_NUM_FLAGS 60
|
||||
|
||||
public class CDocBin
|
||||
{
|
||||
@@ -1155,6 +1166,8 @@ public class CDocEntryBase
|
||||
U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
};
|
||||
|
||||
#define DOCE_LEN_DFT 64
|
||||
|
||||
public class CDocEntry:CDocEntryBase
|
||||
{
|
||||
union {
|
||||
@@ -1180,7 +1193,7 @@ public class CDocEntry:CDocEntryBase
|
||||
*my_fmt_data;
|
||||
I64 hex_ed_width;
|
||||
I32 scroll_len,
|
||||
len,
|
||||
len, //$LK,"DOCE_LEN_DFT",A="MN:DOCE_LEN_DFT"$
|
||||
bin_num;
|
||||
U8 raw_type,pad[3];
|
||||
CDocBin *bin_data;
|
||||
@@ -1200,8 +1213,10 @@ public class CDocEntry:CDocEntryBase
|
||||
|
||||
class CEdFindText
|
||||
{
|
||||
U8 find_text[STR_LEN] fmtstr "$$DA-P,STR_LEN-1,A=\"Find :%s\"$$\n",
|
||||
replace_text[STR_LEN] fmtstr "$$DA-P,STR_LEN-1,A=\"Replace :%s\"$$\n";
|
||||
U8 find_text[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,"
|
||||
"A=\"Find :%s\"$$\n",
|
||||
replace_text[STR_LEN] fmtstr "$$DA-P,LEN=STR_LEN-1,"
|
||||
"A=\"Replace :%s\"$$\n";
|
||||
Bool replace fmtstr "$$CB,\"Replace\"$$\n",
|
||||
scan_fwd fmtstr "$$CB,\"Fwd\"$$\n",
|
||||
scan_selected_text fmtstr "$$CB,\"Selection\"$$\n",
|
||||
@@ -1209,12 +1224,12 @@ class CEdFindText
|
||||
whole_labels fmtstr "$$CB,\"Whole Labels\"$$\n",
|
||||
local_var fmtstr "$$CB,\"Rename Local Var\"$$\n",
|
||||
pmt,pad;
|
||||
I64 filter_lines fmtstr "$$DA,131,A=\"Filter Lines:%d\"$$\n";
|
||||
I64 filter_lines fmtstr "$$DA,A=\"Filter Lines:%d\"$$\n";
|
||||
};
|
||||
|
||||
class CEdFileName
|
||||
{
|
||||
U8 name[256] fmtstr "$$DA-P,255,A=\"FileName:%s\"$$";
|
||||
U8 name[256] fmtstr "$$DA-P,LEN=255,A=\"FileName:%s\"$$";
|
||||
};
|
||||
|
||||
//$LK,"Ed",A="MN:Ed"$()
|
||||
@@ -1241,17 +1256,18 @@ class CEdFileName
|
||||
#define DOCF_FORM 0x200
|
||||
#define DOCF_MIN_SIZE 0x400
|
||||
#define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$
|
||||
#define DOCF_NO_SCROLL_BARS 0x1000 //use $LK,"DocScroll",A="MN:DocScroll"$
|
||||
#define DOCF_ALLOW_UNDO 0x2000
|
||||
#define DOCF_DONT_SHOW 0x4000
|
||||
#define DOCF_HAS_SONG 0x8000
|
||||
#define DOCF_MORE 0x10000
|
||||
#define DOCF_BWD_MOVEMENT 0x20000
|
||||
#define DOCF_NULL_GRAB_SCROLL 0x40000
|
||||
#define DOCF_DONT_SWAP_OUT 0x80000
|
||||
#define DOCF_DO_FULL_REFRESH 0x100000
|
||||
#define DOCF_BREAK_UNLOCKED 0x200000
|
||||
//Reserved x2
|
||||
#define DOCF_DONT_HIGHLIGHT_CURSOR 0x1000 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$
|
||||
#define DOCF_NO_SCROLL_BARS 0x2000 //use $LK,"DocScroll",A="MN:DocScroll"$
|
||||
#define DOCF_ALLOW_UNDO 0x4000
|
||||
#define DOCF_DONT_SHOW 0x8000
|
||||
#define DOCF_HAS_SONG 0x10000
|
||||
#define DOCF_MORE 0x20000
|
||||
#define DOCF_BWD_MOVEMENT 0x40000
|
||||
#define DOCF_NULL_GRAB_SCROLL 0x80000
|
||||
#define DOCF_DONT_SWAP_OUT 0x100000
|
||||
#define DOCF_DO_FULL_REFRESH 0x200000
|
||||
#define DOCF_BREAK_UNLOCKED 0x400000
|
||||
//Reserved x1
|
||||
#define DOCF_HIGHLIGHT DOCEF_HIGHLIGHT
|
||||
#define DOCF_WORD_WRAP DOCEF_WORD_WRAP
|
||||
#define DOCF_BLINK DOCEF_BLINK
|
||||
@@ -1276,17 +1292,18 @@ class CEdFileName
|
||||
#define DOCf_FORM 9
|
||||
#define DOCf_MIN_SIZE 10
|
||||
#define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$
|
||||
#define DOCf_NO_SCROLL_BARS 12 //use $LK,"DocScroll",A="MN:DocScroll"$
|
||||
#define DOCf_ALLOW_UNDO 13
|
||||
#define DOCf_DONT_SHOW 14
|
||||
#define DOCf_HAS_SONG 15
|
||||
#define DOCf_MORE 16
|
||||
#define DOCf_BWD_MOVEMENT 17
|
||||
#define DOCf_NULL_GRAB_SCROLL 18
|
||||
#define DOCf_DONT_SWAP_OUT 19
|
||||
#define DOCf_DO_FULL_REFRESH 20
|
||||
#define DOCf_BREAK_UNLOCKED 21
|
||||
//Reserved x2
|
||||
#define DOCf_DONT_HIGHLIGHT_CURSOR 12 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$
|
||||
#define DOCf_NO_SCROLL_BARS 13 //use $LK,"DocScroll",A="MN:DocScroll"$
|
||||
#define DOCf_ALLOW_UNDO 14
|
||||
#define DOCf_DONT_SHOW 15
|
||||
#define DOCf_HAS_SONG 16
|
||||
#define DOCf_MORE 17
|
||||
#define DOCf_BWD_MOVEMENT 18
|
||||
#define DOCf_NULL_GRAB_SCROLL 19
|
||||
#define DOCf_DONT_SWAP_OUT 20
|
||||
#define DOCf_DO_FULL_REFRESH 21
|
||||
#define DOCf_BREAK_UNLOCKED 22
|
||||
//Reserved x1
|
||||
|
||||
#define DOCf_HIGHLIGHT DOCEf_HIGHLIGHT
|
||||
#define DOCf_WORD_WRAP DOCEf_WORD_WRAP
|
||||
@@ -1315,9 +1332,14 @@ class CDocUndo
|
||||
|
||||
#define DOC_SIGNATURE_VAL 'DocS'
|
||||
|
||||
#define DOC_RECALC 0
|
||||
#define DOC_RECALC_FIND_CURSOR 1
|
||||
#define DOC_RECALC_TO_SCREEN 2
|
||||
#define RECALCt_NORMAL 0x00
|
||||
#define RECALCt_FIND_CURSOR 0x01
|
||||
#define RECALCt_TO_SCREEN 0x02
|
||||
#define RECALCG_MASK 0xFF
|
||||
|
||||
#define RECALCF_HAS_CURSOR 0x100
|
||||
#define RECALCF_ADD_CURSOR 0x200
|
||||
#define RECALCF_TO_HTML 0x400
|
||||
|
||||
public class CDoc //Linked Text File header
|
||||
{//See $LK,"Doc",A="HI:Doc"$ for documentation.
|
||||
@@ -2843,7 +2865,8 @@ class CMemRange
|
||||
public class CBlkPool
|
||||
{
|
||||
I64 locked_flags,alloced_u8s,used_u8s;
|
||||
CMemBlk *mem_free_lst,*mem_free_2meg_lst,
|
||||
CMemBlk *mem_free_lst,
|
||||
*mem_free_2meg_lst, //This is for $LK,"::/Demo/Lectures/Mem/Mem2Meg.CPP"$
|
||||
*free_page_hash[MEM_FREE_PAGE_HASH_SIZE],
|
||||
*free_page_hash2[64-MEM_PAGE_BITS];
|
||||
};
|
||||
@@ -2860,6 +2883,7 @@ public class CHeapCtrl
|
||||
I64 locked_flags,alloced_u8s,used_u8s;
|
||||
CTask *mem_task;
|
||||
CMemBlk *next_mem_blk,*last_mem_blk;
|
||||
CMemBlk *last_mergable;
|
||||
CMemUnused *malloc_free_lst;
|
||||
CMemUsed *next_um,*last_um;
|
||||
CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE/sizeof(U8 *)];
|
||||
@@ -2870,7 +2894,6 @@ public class CDevGlbls
|
||||
{
|
||||
I64 *idt;
|
||||
U8 *mem64_ptr;
|
||||
CHeapCtrl *uncached_heap;
|
||||
U8 mp_apic_ids[MP_MAX_PROCESSORS];
|
||||
CMemRange mem32_root;
|
||||
CPCIDev pci_root;
|
||||
@@ -3020,15 +3043,15 @@ public class CGridGlbls
|
||||
Bool snap fmtstr "$$CB,\"Snap Grid\"$$\n",
|
||||
show fmtstr "$$CB,\"Show Grid\"$$\n";
|
||||
U8 pad[6];
|
||||
F64 x fmtstr "$$DA-TRM,32,RT=F64,A=\"X Spacing:%6.3f\"$$\n",
|
||||
y fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Spacing:%6.3f\"$$\n",
|
||||
z fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Spacing:%6.3f\"$$\n",
|
||||
x_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"X Offset :%6.3f\"$$\n",
|
||||
y_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Offset :%6.3f\"$$\n",
|
||||
z_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Offset :%6.3f\"$$\n",
|
||||
x_speed fmtstr "$$DA-TRM,32,RT=F64,A=\"X Speed :%6.3f\"$$\n",
|
||||
y_speed fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Speed :%6.3f\"$$\n",
|
||||
z_speed fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Speed :%6.3f\"$$\n";
|
||||
F64 x fmtstr "$$DA-TRM,RT=F64,A=\"X Spacing:%6.3f\"$$\n",
|
||||
y fmtstr "$$DA-TRM,RT=F64,A=\"Y Spacing:%6.3f\"$$\n",
|
||||
z fmtstr "$$DA-TRM,RT=F64,A=\"Z Spacing:%6.3f\"$$\n",
|
||||
x_offset fmtstr "$$DA-TRM,RT=F64,A=\"X Offset :%6.3f\"$$\n",
|
||||
y_offset fmtstr "$$DA-TRM,RT=F64,A=\"Y Offset :%6.3f\"$$\n",
|
||||
z_offset fmtstr "$$DA-TRM,RT=F64,A=\"Z Offset :%6.3f\"$$\n",
|
||||
x_speed fmtstr "$$DA-TRM,RT=F64,A=\"X Speed :%6.3f\"$$\n",
|
||||
y_speed fmtstr "$$DA-TRM,RT=F64,A=\"Y Speed :%6.3f\"$$\n",
|
||||
z_speed fmtstr "$$DA-TRM,RT=F64,A=\"Z Speed :%6.3f\"$$\n";
|
||||
};
|
||||
|
||||
#help_index "Ctrls"
|
||||
@@ -3163,8 +3186,8 @@ class CSrvCmd
|
||||
#define SVCRf_LOCKED 0
|
||||
class CSrvCtrl
|
||||
{
|
||||
CSrvCmd *next_waiting,*last_waiting,
|
||||
*next_done,*last_done;
|
||||
CSrvCmd *next_waiting,*last_waiting;
|
||||
CSrvCmd *next_done,*last_done;
|
||||
I64 flags;
|
||||
};
|
||||
|
||||
@@ -3193,9 +3216,6 @@ class CSrvCtrl
|
||||
#define MSG_IP_R_DOWN_UP -9 //Down & Up
|
||||
#define MSG_IP_R_D_DOWN_UP -11 //Down & Up
|
||||
|
||||
#help_index "Task"
|
||||
#define TASK_TITLE_LEN 127
|
||||
|
||||
#help_index "Task/Settings"
|
||||
#define TSF_SAME_SONG 1
|
||||
public class CTaskSettings
|
||||
@@ -3211,8 +3231,8 @@ public class CTaskSettings
|
||||
U32 win_inhibit;;
|
||||
U8 text_attr,title_src,
|
||||
border_attr,border_src,
|
||||
task_title[TASK_TITLE_LEN+1];
|
||||
Bool border,cursor,scroll,autocomplete,pad[4];
|
||||
task_title[STR_LEN];
|
||||
Bool border,hide_cursor,highlight_cursor,scroll,autocomplete,pad[3];
|
||||
U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
};
|
||||
|
||||
@@ -3254,7 +3274,7 @@ public class CTaskSettings
|
||||
#define DISPLAYf_CHILDREN_NOT_ON_TOP 5
|
||||
|
||||
#define TASK_SIGNATURE_VAL 'TskS'
|
||||
#define TASK_NAME_LEN 31
|
||||
#define TASK_NAME_LEN 32
|
||||
class CTaskStk
|
||||
{
|
||||
CTaskStk *next_stk;
|
||||
@@ -3262,12 +3282,20 @@ class CTaskStk
|
||||
U0 stk_base;
|
||||
};
|
||||
|
||||
#define DYING_JIFFIES ToI64(JIFFY_FREQ/5)
|
||||
class CTaskDying
|
||||
{
|
||||
CTask *next,*last;
|
||||
I64 wake_jiffy;
|
||||
};
|
||||
|
||||
public class CTask //The Fs segment reg points to current CTask.
|
||||
{
|
||||
CTask *addr; //Self-addressed ptr
|
||||
U32 task_signature;
|
||||
U32 task_flags,display_flags,win_inhibit;
|
||||
U32 task_signature,win_inhibit;
|
||||
U0 pad;#assert $$==offset(CTaskDying.wake_jiffy)
|
||||
I64 wake_jiffy;
|
||||
U32 task_flags,display_flags;
|
||||
|
||||
CHeapCtrl *code_heap,*data_heap;
|
||||
|
||||
@@ -3305,8 +3333,8 @@ public class CTask //The Fs segment reg points to current CTask.
|
||||
|
||||
U0 (*draw_it)(CTask *task,CDC *dc);
|
||||
|
||||
U8 task_title[TASK_TITLE_LEN+1],
|
||||
task_name[TASK_NAME_LEN+1],
|
||||
U8 task_title[STR_LEN],
|
||||
task_name[TASK_NAME_LEN],
|
||||
wallpaper_data[STR_LEN],
|
||||
|
||||
title_src,border_src,
|
||||
@@ -3384,8 +3412,8 @@ class CTSS
|
||||
#define _R15 Fs->r15
|
||||
|
||||
#help_index "MultiCore"
|
||||
#define CPUf_RAN_A_TASK 0
|
||||
#define CPUf_SETH_SLEEP 1
|
||||
#define CPUf_RAN_A_TASK 0
|
||||
#define CPUf_DYING_TASK_QUE 1
|
||||
|
||||
public class CCPU //The Gs segment reg points to current CCPU.
|
||||
{
|
||||
@@ -3399,7 +3427,8 @@ public class CCPU //The Gs segment reg points to current CCPU.
|
||||
I64 tr, //task reg
|
||||
swap_cnter;
|
||||
U0 (*profiler_timer_irq)(CTask *task);
|
||||
CTask *dying_task_lst;
|
||||
CTaskDying *next_dying,*last_dying;
|
||||
I64 kill_jiffy;
|
||||
CTSS *tss;
|
||||
I64 start_stk[16];
|
||||
U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
@@ -3643,7 +3672,8 @@ public class CDC
|
||||
//Set by $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$()
|
||||
CGrSym sym;
|
||||
|
||||
I64 dist,nearest_dist,
|
||||
I64 nearest_dist,
|
||||
cur_sprite_elem_num,
|
||||
nearest_sprite_elem_num; //num in a CSprite elem lst
|
||||
|
||||
I32 cur_x,cur_y,cur_z,pad;
|
||||
@@ -3841,20 +3871,19 @@ public class CDbgGlbls
|
||||
//Registry sys_msg_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$()
|
||||
#define ARf_FLOODFILL 0
|
||||
#define ARf_CSPRITE_INS_CLIPBOARD 1
|
||||
#define ARf_CSPRITE_PICK_GRAPHICALLY 2
|
||||
#define ARf_PLANAR_SYMMETRY 3
|
||||
#define ARf_PSALMODY_JUKEBOX 4
|
||||
#define ARf_MESH_ED 5
|
||||
#define ARf_CSPRITE_PTS_RECTANGLES 6
|
||||
#define ARf_MANAGE_SLIDER 7
|
||||
#define ARf_PLANAR_SYMMETRY 2
|
||||
#define ARf_PSALMODY_JUKEBOX 3
|
||||
#define ARf_MESH_ED 4
|
||||
#define ARf_CSPRITE_PTS_RECTANGLES 5
|
||||
#define ARf_MANAGE_SLIDER 6
|
||||
|
||||
#help_index "Misc/Progress Bars"
|
||||
#define NUM_PROGRESS_BARS 4
|
||||
#define PROGRESS_DESC_LEN (64-8-8-1)
|
||||
#define PROGRESS_DESC_LEN (64-8-8)
|
||||
class CProgress
|
||||
{
|
||||
I64 val,max;
|
||||
U8 desc[PROGRESS_DESC_LEN+1];
|
||||
U8 desc[PROGRESS_DESC_LEN];
|
||||
};
|
||||
|
||||
#help_index ""
|
||||
+4
-4
@@ -211,19 +211,19 @@ _extern SYS_CTRL_ALT_FLAGS
|
||||
#help_index "Misc/Progress Bars"
|
||||
public _extern SYS_PROGRESS1 I64 progress1; //Current progress 1.
|
||||
public _extern SYS_PROGRESS1_DESC
|
||||
U8 progress1_desc[PROGRESS_DESC_LEN+1]; //Progress 1 desc.
|
||||
U8 progress1_desc[PROGRESS_DESC_LEN]; //Progress 1 desc.
|
||||
public _extern SYS_PROGRESS1_MAX I64 progress1_max; //Max progress 1.
|
||||
public _extern SYS_PROGRESS2 I64 progress2; //Current progress 2.
|
||||
public _extern SYS_PROGRESS2_DESC
|
||||
U8 progress2_desc[PROGRESS_DESC_LEN+1]; //Progress 2 desc.
|
||||
U8 progress2_desc[PROGRESS_DESC_LEN]; //Progress 2 desc.
|
||||
public _extern SYS_PROGRESS2_MAX I64 progress2_max; //Max progress 2.
|
||||
public _extern SYS_PROGRESS3 I64 progress3; //Current progress 3.
|
||||
public _extern SYS_PROGRESS3_DESC
|
||||
U8 progress3_desc[PROGRESS_DESC_LEN+1]; //Progress 3 desc.
|
||||
U8 progress3_desc[PROGRESS_DESC_LEN]; //Progress 3 desc.
|
||||
public _extern SYS_PROGRESS3_MAX I64 progress3_max; //Max progress 3.
|
||||
public _extern SYS_PROGRESS4 I64 progress4; //Current progress 4.
|
||||
public _extern SYS_PROGRESS4_DESC
|
||||
U8 progress4_desc[PROGRESS_DESC_LEN+1]; //Progress 4 desc.
|
||||
U8 progress4_desc[PROGRESS_DESC_LEN]; //Progress 4 desc.
|
||||
public _extern SYS_PROGRESS4_MAX I64 progress4_max; //Max progress 4.
|
||||
public _extern SYS_PROGRESSES
|
||||
CProgress sys_progresses[NUM_PROGRESS_BARS]; //All progress bars.
|
||||
|
||||
+3
-10
@@ -525,12 +525,8 @@ public extern U8 *AMAllocIdentical(U8 *src);
|
||||
#help_index "Memory/BlkPool"
|
||||
public extern U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512);
|
||||
public extern U0 BlkPoolInit(CBlkPool *bp,I64 pages512);
|
||||
public extern U8 *Mem2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U0 Mem2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem2MegUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem2MegWriteThruAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem512Alloc(I64 *_pages512,CBlkPool *bp=NULL);
|
||||
public extern U0 Mem512Free(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem512Alloc(I64 pages512,CBlkPool *bp=NULL);
|
||||
public extern U0 Mem512Free(CMemBlk *m,CBlkPool *bp=NULL);
|
||||
|
||||
#help_index "Memory/Heap"
|
||||
public extern U8 *CAlloc(I64 size,CTask *mem_task=NULL);
|
||||
@@ -546,7 +542,6 @@ public _extern _MSIZE I64 MSize(U8 *src); //size of heap object
|
||||
public _extern _MSIZE2 I64 MSize2(U8 *src); //Internal size
|
||||
|
||||
#help_index "Memory/HeapCtrl"
|
||||
public extern CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512);
|
||||
public extern U0 HeapCtrlDel(CHeapCtrl *hc);
|
||||
public extern CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,
|
||||
CTask *task=NULL,CBlkPool *bp);
|
||||
@@ -584,7 +579,6 @@ extern U0 CoreAPSethTask();
|
||||
public extern U0 MPInt(U8 num,I64 cpu_num=1);
|
||||
public extern U0 MPIntAll(U8 num);
|
||||
public extern U0 MPNMInt();
|
||||
public extern U0 MPWake(I64 target_cpu);
|
||||
extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
U8 *task_name=NULL,I64 target_cpu,
|
||||
CTask *parent=NULL, //NULL means adam
|
||||
@@ -640,8 +634,7 @@ public extern Bool Kill(CTask *task,Bool wait=TRUE);
|
||||
public extern Bool Suspend(CTask *task=NULL,Bool state=TRUE);
|
||||
_extern _TASK_CONTEXT_RESTORE U0 TaskContextRestore();
|
||||
_extern _TASK_END_NOW U0 TaskEndNow();
|
||||
extern U0 TaskFinishOff(CTask *task);
|
||||
extern U0 TaskFinishOffDying();
|
||||
extern U0 TaskKillDying();
|
||||
public extern U0 TaskQueIns(CTask *task,CTask *pred=NULL);
|
||||
public extern U0 TaskQueRem(CTask *task);
|
||||
public extern Bool TaskValidate(CTask *task);
|
||||
|
||||
+3
-16
@@ -1,30 +1,17 @@
|
||||
CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,CTask *task=NULL,CBlkPool *bp)
|
||||
{//Called by $LK,"Adam Task",A="FF:::/Kernel/KStart.CPP,CHeapCtrl.bp"$.
|
||||
{//See $LK,"HeapLog",A="MN:HeapLog"$() for an example.
|
||||
//Duplicated for $LK,"Adam Task",A="FF:::/Kernel/KStart.CPP,CHeapCtrl.bp"$.
|
||||
if (!hc)
|
||||
hc=ACAlloc(sizeof(CHeapCtrl));
|
||||
hc->hc_signature=HEAP_CTRL_SIGNATURE_VAL;
|
||||
hc->mem_task=task;
|
||||
hc->bp=bp;
|
||||
QueInit(&hc->next_mem_blk);
|
||||
hc->last_mergable=NULL;
|
||||
hc->next_um=hc->last_um=(&hc->next_um)(U8 *)-offset(CMemUsed.next);
|
||||
return hc;
|
||||
}
|
||||
|
||||
CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512)
|
||||
{//Make mem chunk into HeapCtrl and BlkPool.
|
||||
I64 num;
|
||||
CMemBlk *m;
|
||||
CHeapCtrl *hc;
|
||||
MemSet(bp,0,sizeof(CBlkPool)+sizeof(CHeapCtrl));
|
||||
hc=HeapCtrlInit(bp(U8 *)+sizeof(CBlkPool),,bp);
|
||||
m=(bp(U8 *)+sizeof(CBlkPool)+sizeof(CHeapCtrl)+MEM_PAGE_SIZE-1)&
|
||||
~(MEM_PAGE_SIZE-1);
|
||||
num=(bp(U8 *)+pages512<<MEM_PAGE_BITS-m(U8 *))>>MEM_PAGE_BITS;
|
||||
bp->alloced_u8s=(pages512-num)<<MEM_PAGE_BITS;
|
||||
BlkPoolAdd(bp,m,num);
|
||||
return hc;
|
||||
}
|
||||
|
||||
U0 HeapCtrlDel(CHeapCtrl *hc)
|
||||
{//Free all blks alloced to a HeapCtrl.
|
||||
CMemBlk *m,*m1;
|
||||
|
||||
+52
-38
@@ -55,16 +55,14 @@ _MALLOC::
|
||||
SHR RAX,MEM_PAGE_BITS
|
||||
|
||||
PUSH RDX //preserve HeapCtrl
|
||||
PUSH RAX //num blks (we must pass address of this)
|
||||
MOV RAX,RSP
|
||||
PUSH RDX
|
||||
PUSH RAX //addr of num blks
|
||||
PUSH RAX
|
||||
CALL &Mem512TaskAlloc
|
||||
MOV RSI,RAX
|
||||
POP RAX //blks that were alloced
|
||||
POP RDX
|
||||
TEST RSI,RSI
|
||||
TEST RAX,RAX
|
||||
JZ @@45 //Out of memory
|
||||
MOV RSI,RAX
|
||||
MOV EAX,U32 CMemBlk.pages[RSI]
|
||||
|
||||
SHL RAX,MEM_PAGE_BITS
|
||||
SUB RAX,sizeof(CMemBlk)
|
||||
@@ -77,21 +75,17 @@ _MALLOC::
|
||||
@@40: MOV RBX,RSI
|
||||
MOV RSI,U64 CMemUnused.next[RBX]
|
||||
TEST RSI,RSI
|
||||
JNZ @@55
|
||||
JNZ I32 @@60
|
||||
PUSH RAX //-**** save byte size
|
||||
ADD RAX,16*MEM_PAGE_SIZE-1
|
||||
SHR RAX,MEM_PAGE_BITS
|
||||
|
||||
PUSH RDX //preserve HeapCtrl
|
||||
PUSH RAX //num blks (we must pass address of this)
|
||||
MOV RAX,RSP
|
||||
PUSH RDX
|
||||
PUSH RAX //addr of num blks
|
||||
PUSH RAX
|
||||
CALL &Mem512TaskAlloc
|
||||
MOV RSI,RAX
|
||||
POP RAX //blks that were alloced
|
||||
POP RDX
|
||||
TEST RSI,RSI
|
||||
TEST RAX,RAX
|
||||
JNZ @@50
|
||||
|
||||
//Out of memory
|
||||
@@ -104,8 +98,28 @@ _MALLOC::
|
||||
CALL I32 &throw
|
||||
JMP I32 MALLOC_FINAL_EXIT //Never gets here, hopefully.
|
||||
|
||||
@@50: LEA RSI,U64 sizeof(CMemBlk)[RSI]
|
||||
@@50: MOV RSI,RAX
|
||||
MOV EAX,U32 CMemBlk.pages[RSI]
|
||||
SHL RAX,MEM_PAGE_BITS
|
||||
|
||||
//Can it be combined with last chunk? (Never Free these chunks.)
|
||||
MOV RDI,U64 CHeapCtrl.last_mergable[RDX]
|
||||
LEA RBX,U64 [RSI+RAX]
|
||||
CMP RDI,RBX
|
||||
JNE @@55
|
||||
|
||||
PUSH RAX
|
||||
MOV EAX,U32 CMemBlk.pages[RDI]
|
||||
ADD U32 CMemBlk.pages[RSI],EAX
|
||||
//QueRem
|
||||
MOV RAX,U64 CMemBlk.next[RDI]
|
||||
MOV RBX,U64 CMemBlk.last[RDI]
|
||||
MOV U64 CMemBlk.last[RAX],RBX
|
||||
MOV U64 CMemBlk.next[RBX],RAX
|
||||
POP RAX
|
||||
|
||||
@@55: MOV U64 CHeapCtrl.last_mergable[RDX],RSI
|
||||
LEA RSI,U64 sizeof(CMemBlk)[RSI]
|
||||
SUB RAX,sizeof(CMemBlk)
|
||||
LEA RBX,U64 CHeapCtrl.malloc_free_lst-CMemUnused.next[RDX]
|
||||
MOV RDI,U64 CMemUnused.next[RBX]
|
||||
@@ -113,22 +127,22 @@ _MALLOC::
|
||||
MOV U64 CMemUnused.size[RSI],RAX
|
||||
MOV U64 CMemUnused.next[RBX],RSI
|
||||
POP RAX //+****
|
||||
JMP @@65
|
||||
@@55: CMP U64 CMemUnused.size[RSI],RAX
|
||||
JB @@40
|
||||
JNE @@65
|
||||
JMP @@70
|
||||
@@60: CMP U64 CMemUnused.size[RSI],RAX
|
||||
JB I32 @@40
|
||||
JNE @@70
|
||||
|
||||
@@60: MOV RDI,U64 CMemUnused.next[RSI]
|
||||
@@65: MOV RDI,U64 CMemUnused.next[RSI]
|
||||
MOV U64 CMemUnused.next[RBX],RDI
|
||||
JMP MALLOC_ALMOST_DONE
|
||||
|
||||
@@65: SUB U64 CMemUnused.size[RSI],RAX //UPDATE FREE ENTRY
|
||||
@@70: SUB U64 CMemUnused.size[RSI],RAX //UPDATE FREE ENTRY
|
||||
CMP U64 CMemUnused.size[RSI],sizeof(CMemUnused)
|
||||
JAE @@70 //take from top of block
|
||||
JAE @@75 //take from top of block
|
||||
ADD U64 CMemUnused.size[RSI],RAX //doesn't fit, undo
|
||||
JMP I32 @@40
|
||||
|
||||
@@70: ADD RSI,U64 CMemUnused.size[RSI]
|
||||
@@75: ADD RSI,U64 CMemUnused.size[RSI]
|
||||
|
||||
MALLOC_ALMOST_DONE:
|
||||
//RSI=result-CMemUsed.size
|
||||
@@ -150,21 +164,21 @@ MALLOC_ALMOST_DONE:
|
||||
MOV RDX,U64 [SYS_HEAP_LIMIT]
|
||||
MOV RDI,U64 SF_RIP[RBP]
|
||||
CMP RDI,RDX
|
||||
JB @@75
|
||||
XOR RDI,RDI
|
||||
MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
JMP @@85
|
||||
@@75: MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
MOV RDI,U64 SF_RBP[RBP]
|
||||
CMP RDI,RDX
|
||||
JB @@80
|
||||
XOR RDI,RDI
|
||||
JMP @@85
|
||||
@@80: MOV RDI,U64 SF_RIP[RDI]
|
||||
MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
JMP @@90
|
||||
@@80: MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
MOV RDI,U64 SF_RBP[RBP]
|
||||
CMP RDI,RDX
|
||||
JB @@85
|
||||
XOR RDI,RDI
|
||||
@@85: MOV U64 CMemUsed.caller2[RSI],RDI
|
||||
JMP @@90
|
||||
@@85: MOV RDI,U64 SF_RIP[RDI]
|
||||
CMP RDI,RDX
|
||||
JB @@90
|
||||
XOR RDI,RDI
|
||||
@@90: MOV U64 CMemUsed.caller2[RSI],RDI
|
||||
POP RDX
|
||||
|
||||
#endif
|
||||
@@ -177,19 +191,19 @@ MALLOC_ALMOST_DONE:
|
||||
LEA RAX,U64 CMemUsed.start[RSI]
|
||||
|
||||
TEST U8 [SYS_SEMAS+SYS_SEMA_HEAPLOG_ACTIVE*SEMA_STRUCT_SIZE],1
|
||||
JZ @@100
|
||||
JZ @@105
|
||||
PUSH RAX
|
||||
PUSH RAX
|
||||
MOV RAX,U64 [SYS_EXTERN_TABLE]
|
||||
MOV RAX,U64 EXT_HEAPLOG_MALLOC*8[RAX]
|
||||
TEST RAX,RAX
|
||||
JZ @@90
|
||||
JZ @@95
|
||||
CALL RAX
|
||||
JMP @@95
|
||||
@@90: ADD RSP,8
|
||||
@@95: POP RAX
|
||||
JMP @@100
|
||||
@@95: ADD RSP,8
|
||||
@@100: POP RAX
|
||||
|
||||
@@100: TEST U8 [SYS_HEAP_INIT_FLAG],1
|
||||
@@105: TEST U8 [SYS_HEAP_INIT_FLAG],1
|
||||
JZ MALLOC_FINAL_EXIT
|
||||
|
||||
PUSH RAX
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#exe {Cd(__DIR__);};
|
||||
#include "PageTables"
|
||||
#include "Mem2Meg"
|
||||
#include "Mem512"
|
||||
#include "BlkPool"
|
||||
#include "MAllocFree"
|
||||
|
||||
@@ -1,180 +0,0 @@
|
||||
U8 *Mem2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
|
||||
Return: NULL if out of memory.
|
||||
*/
|
||||
I64 i,j,*pte,num=*_pages2Meg;
|
||||
CMemBlk *result=NULL,*m,*m1;
|
||||
|
||||
if (!bp) bp=sys_code_bp;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&bp->locked_flags,BPlf_LOCKED))
|
||||
PAUSE
|
||||
num<<=21-MEM_PAGE_BITS;
|
||||
|
||||
m=&bp->mem_free_2meg_lst;
|
||||
while (TRUE) {
|
||||
if (!(result=m->next))
|
||||
break;
|
||||
if (result->pages<num)
|
||||
m=result;
|
||||
else {
|
||||
if (result->pages==num) {
|
||||
m->next=result->next;
|
||||
goto am_done;
|
||||
} else {
|
||||
result->pages-=num;
|
||||
result(U8 *)+=result->pages<<MEM_PAGE_BITS;
|
||||
result->pages=num;
|
||||
goto am_done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m=&bp->mem_free_lst;
|
||||
while (TRUE) {
|
||||
if (!(result=m->next)) {
|
||||
num=0;
|
||||
result=NULL; //Out of memory
|
||||
goto am_done;
|
||||
}
|
||||
if (result->pages<num)
|
||||
m=result;
|
||||
else {
|
||||
if (result->pages==num) {
|
||||
if (result(U8 *)&0x1FFFFF)
|
||||
m=result;
|
||||
else {
|
||||
m->next=result->next;
|
||||
goto am_done;
|
||||
}
|
||||
} else {
|
||||
if (i=(result(U8 *)&0x1FFFFF)>>MEM_PAGE_BITS) {
|
||||
j=1<<(21-MEM_PAGE_BITS)-i;
|
||||
if (result->pages<num+j)
|
||||
m=result;
|
||||
else if (result->pages==num+j) {
|
||||
result->pages-=num;
|
||||
result(U8 *)+=result->pages<<MEM_PAGE_BITS;
|
||||
result->pages=num;
|
||||
goto am_done;
|
||||
} else {
|
||||
m1=result;
|
||||
result(U8 *)+=j<<MEM_PAGE_BITS;
|
||||
result->pages=num;
|
||||
m=result(U8 *)+num<<MEM_PAGE_BITS;
|
||||
m->pages=m1->pages-num-j;
|
||||
m1->pages=j;
|
||||
m->next=m1->next;
|
||||
m1->next=m;
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
goto am_done;
|
||||
}
|
||||
} else {
|
||||
m=m->next=result(U8 *)+num<<MEM_PAGE_BITS;
|
||||
m->next=result->next;
|
||||
m->pages=result->pages-num;
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
result->pages=num;
|
||||
goto am_done;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
am_done:
|
||||
i=num<<MEM_PAGE_BITS;
|
||||
bp->used_u8s+=i;
|
||||
num>>=21-MEM_PAGE_BITS;
|
||||
*_pages2Meg=num;
|
||||
m=result;
|
||||
m1=m(U8 *)+i;
|
||||
while (m<m1) {
|
||||
pte=MemPageTable(m);
|
||||
*pte &= ~0x18;
|
||||
InvlPg(m);
|
||||
m(U8 *)+=MemPageSize(m);
|
||||
}
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *Mem2MegUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It will be marked uncached. It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
|
||||
Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result,*m,*m1;
|
||||
I64 num=*_pages2Meg,*pte;
|
||||
if (result=Mem2MegAlloc(_pages2Meg,bp)) {
|
||||
num=*_pages2Meg;
|
||||
m=result;
|
||||
m1=m(U8 *)+num<<21;
|
||||
while (m<m1) {
|
||||
pte=MemPageTable(m);
|
||||
*pte= *pte& ~0x18 |0x10;
|
||||
InvlPg(m);
|
||||
m(U8 *)+=MemPageSize(m);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *Mem2MegWriteThruAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It will be marked write-through. It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
|
||||
Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result,*m,*m1;
|
||||
I64 num=*_pages2Meg,*pte;
|
||||
if (result=Mem2MegAlloc(_pages2Meg,bp)) {
|
||||
num=*_pages2Meg;
|
||||
m=result;
|
||||
m1=m(U8 *)+num<<21;
|
||||
while (m<m1) {
|
||||
pte=MemPageTable(m);
|
||||
*pte= *pte& ~0x18 |8;
|
||||
InvlPg(m);
|
||||
m(U8 *)+=MemPageSize(m);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 Mem2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL)
|
||||
{//Return non-task 2Meg pages to BlkPool.
|
||||
I64 *pte;
|
||||
CMemBlk *m1,*m2;
|
||||
if (m) {
|
||||
if (!bp) bp=sys_code_bp;
|
||||
m2=m;
|
||||
m1=m(U8 *)+pages2Meg<<21;
|
||||
while (m2<m1) {
|
||||
pte=MemPageTable(m2);
|
||||
*pte=*pte & ~0x18;
|
||||
InvlPg(m2);
|
||||
m2(U8 *)+=MemPageSize(m2);
|
||||
}
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&bp->locked_flags,BPlf_LOCKED))
|
||||
PAUSE
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
m->pages=pages2Meg<<(21-MEM_PAGE_BITS);
|
||||
bp->used_u8s-=pages2Meg<<21;
|
||||
m->next=bp->mem_free_2meg_lst;
|
||||
bp->mem_free_2meg_lst=m;
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
POPFD
|
||||
}
|
||||
}
|
||||
+22
-24
@@ -8,7 +8,7 @@ U0 SysBadMAlloc(I64 *ptr)
|
||||
Dbg("Bad MAlloc:",ptr);
|
||||
}
|
||||
|
||||
U8 *Mem512Alloc(I64 *_pages512,CBlkPool *bp=NULL)
|
||||
U8 *Mem512Alloc(I64 pages512,CBlkPool *bp=NULL)
|
||||
{/*Alloc 512Byte pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It might give you more than you asked for
|
||||
@@ -17,15 +17,15 @@ so a ptr to a page count is passed.
|
||||
Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result=NULL,*m;
|
||||
I64 i,num=*_pages512;
|
||||
I64 i;
|
||||
if (!bp) bp=sys_code_bp;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&bp->locked_flags,BPlf_LOCKED))
|
||||
PAUSE
|
||||
if (num<MEM_FREE_PAGE_HASH_SIZE) {
|
||||
if (result=bp->free_page_hash[num]) {
|
||||
bp->free_page_hash[num]=result->next;
|
||||
if (pages512<MEM_FREE_PAGE_HASH_SIZE) {
|
||||
if (result=bp->free_page_hash[pages512]) {
|
||||
bp->free_page_hash[pages512]=result->next;
|
||||
goto at_done;
|
||||
}
|
||||
i=Bsr(MEM_FREE_PAGE_HASH_SIZE)+1;
|
||||
@@ -35,9 +35,9 @@ Return: NULL if out of memory.
|
||||
//we wouldn't want to round to the next
|
||||
//power of two if a power of two was requested.
|
||||
//So we use a little more than a power of two.
|
||||
num-=MEM_EXTRA_HASH2_PAGES;
|
||||
i=Bsr(num)+1;
|
||||
num=1<<i+MEM_EXTRA_HASH2_PAGES;
|
||||
pages512-=MEM_EXTRA_HASH2_PAGES;
|
||||
i=Bsr(pages512)+1;
|
||||
pages512=1<<i+MEM_EXTRA_HASH2_PAGES;
|
||||
if (result=bp->free_page_hash2[i]) {
|
||||
bp->free_page_hash2[i]=result->next;
|
||||
goto at_done;
|
||||
@@ -50,48 +50,47 @@ Return: NULL if out of memory.
|
||||
//freed larger size block... and, screw-it, return the whole thing.
|
||||
do {
|
||||
if (result=bp->free_page_hash2[++i]) {
|
||||
num=1<<i+MEM_EXTRA_HASH2_PAGES;
|
||||
pages512=1<<i+MEM_EXTRA_HASH2_PAGES;
|
||||
bp->free_page_hash2[i]=result->next;
|
||||
goto at_done;
|
||||
}
|
||||
} while (i<64-MEM_PAGE_BITS-1);
|
||||
num=0;
|
||||
pages512=0;
|
||||
result=NULL; //Out of memory
|
||||
goto at_done;
|
||||
}
|
||||
if (result->pages<num)
|
||||
if (result->pages<pages512)
|
||||
m=result;
|
||||
else {
|
||||
if (result->pages==num) {
|
||||
if (result->pages==pages512) {
|
||||
m->next=result->next;
|
||||
goto at_done;
|
||||
} else {
|
||||
result->pages-=num;
|
||||
result->pages-=pages512;
|
||||
result(U8 *)+=result->pages<<MEM_PAGE_BITS;
|
||||
result->pages=num;
|
||||
result->pages=pages512;
|
||||
goto at_done;
|
||||
}
|
||||
}
|
||||
}
|
||||
at_done:
|
||||
*_pages512=num;
|
||||
bp->used_u8s+=num<<MEM_PAGE_BITS;
|
||||
bp->used_u8s+=pages512<<MEM_PAGE_BITS;
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 Mem512Free(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
U0 Mem512Free(CMemBlk *m,CBlkPool *bp=NULL)
|
||||
{//Return non-task 512Byte pages to BlkPool.
|
||||
I64 i;
|
||||
I64 i,pages512;
|
||||
if (m) {
|
||||
if (!bp) bp=sys_code_bp;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&bp->locked_flags,BPlf_LOCKED))
|
||||
PAUSE
|
||||
pages512=m->pages;
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
m->pages=pages512;
|
||||
bp->used_u8s-=pages512<<MEM_PAGE_BITS;
|
||||
if (pages512<MEM_FREE_PAGE_HASH_SIZE) {
|
||||
m->next=bp->free_page_hash[pages512];
|
||||
@@ -112,19 +111,18 @@ U0 Mem512Free(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
}
|
||||
}
|
||||
|
||||
CMemBlk *Mem512TaskAlloc(I64 *_pages512,CHeapCtrl *hc)
|
||||
CMemBlk *Mem512TaskAlloc(I64 pages512,CHeapCtrl *hc)
|
||||
{/*hc must be locked. Interrupts should probably be off
|
||||
Currently, this is only called from $LK,"MAlloc",A="MN:MAlloc"$().
|
||||
|
||||
Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result;
|
||||
I64 threshold,cnt,size;
|
||||
CMemUnused *uum,**_uum,**_ptr;
|
||||
if (result=Mem512Alloc(_pages512,hc->bp)) {
|
||||
if (result=Mem512Alloc(pages512,hc->bp)) {
|
||||
QueIns(result,hc->last_mem_blk);
|
||||
result->mb_signature=MBS_USED_SIGNATURE_VAL;
|
||||
hc->alloced_u8s+=*_pages512<<MEM_PAGE_BITS;
|
||||
hc->alloced_u8s+=result->pages<<MEM_PAGE_BITS;
|
||||
|
||||
//Tidy-up free lst (Move into heap hash)
|
||||
//because if free lst gets long, delay causes crash
|
||||
@@ -162,7 +160,7 @@ U0 Mem512TaskFree(CMemBlk *m,CHeapCtrl *hc)
|
||||
else {
|
||||
QueRem(m);
|
||||
hc->alloced_u8s-=m->pages<<MEM_PAGE_BITS;
|
||||
Mem512Free(m,m->pages,hc->bp);
|
||||
Mem512Free(m,hc->bp);
|
||||
}
|
||||
POPFD
|
||||
}
|
||||
|
||||
+22
-40
@@ -119,6 +119,7 @@ CCPU *CPUStructInit(I64 num,CCPU *c,CTask *seth_task)
|
||||
c->addr=c;
|
||||
c->num=num;
|
||||
c->idle_factor=0.01;
|
||||
QueInit(&c->next_dying);
|
||||
if (Bt(&sys_run_level,RLf_BOOT_HEAP)) {
|
||||
c->idle_task=Spawn(0,NULL,"Idle Task",,Fs,,0);
|
||||
LBts(&c->idle_task->task_flags,TASKf_IDLE);
|
||||
@@ -167,24 +168,6 @@ U0 MPHalt()
|
||||
BusyWait(10000);
|
||||
}
|
||||
|
||||
U0 MPWake(I64 target_cpu)
|
||||
{//Send wake-up interupt to core.
|
||||
if (0<=target_cpu<mp_cnt) {
|
||||
PUSHFD
|
||||
CLI
|
||||
if (Bt(&cpu_structs[target_cpu].cpu_flags,CPUf_SETH_SLEEP))
|
||||
cpu_structs[target_cpu].seth_task->wake_jiffy=0;
|
||||
if (!target_cpu)
|
||||
LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG);
|
||||
MPInt(I_WAKE,target_cpu);
|
||||
if (Bt(&cpu_structs[target_cpu].cpu_flags,CPUf_SETH_SLEEP))//back to sleep?
|
||||
cpu_structs[target_cpu].seth_task->wake_jiffy=0;
|
||||
if (!target_cpu)
|
||||
LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG);
|
||||
POPFD
|
||||
}
|
||||
}
|
||||
|
||||
U0 MPAPICInit()
|
||||
{//Called by adam during start-up
|
||||
//and other cores during initialization
|
||||
@@ -210,22 +193,20 @@ U0 MPAPICInit()
|
||||
|
||||
U0 CoreAPSethTask()
|
||||
{
|
||||
CSrvCtrl *my_ctrl=&Fs->srv_ctrl;
|
||||
CSrvCmd *tempc,*tempc1=&my_ctrl->next_waiting;
|
||||
STI
|
||||
CSrvCtrl *ctrl=&Fs->srv_ctrl;
|
||||
while (TRUE) {
|
||||
TaskFinishOffDying;
|
||||
if (!LBts(&my_ctrl->flags,SVCRf_LOCKED)) {
|
||||
tempc=tempc1->next;
|
||||
if (tempc==tempc1 || !SrvCmdRun(GetRFlags,tempc)) {
|
||||
LBtr(&my_ctrl->flags,SVCRf_LOCKED) ;
|
||||
if (my_ctrl->next_waiting==my_ctrl) {
|
||||
Bts(&Gs->cpu_flags,CPUf_SETH_SLEEP);
|
||||
Sleep(20);
|
||||
Btr(&Gs->cpu_flags,CPUf_SETH_SLEEP);
|
||||
}
|
||||
}
|
||||
}
|
||||
STI
|
||||
do {
|
||||
TaskKillDying;
|
||||
do PAUSE
|
||||
while (LBts(&ctrl->flags,SVCRf_LOCKED));
|
||||
} while (ctrl->next_waiting!=ctrl && SrvCmdRunOne(GetRFlags,ctrl));
|
||||
CLI
|
||||
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
|
||||
LBtr(&ctrl->flags,SVCRf_LOCKED);
|
||||
LBts(&Fs->task_flags,TASKf_IDLE);
|
||||
Yield;
|
||||
LBtr(&Fs->task_flags,TASKf_IDLE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +218,7 @@ CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
//See $LK,"::/Demo/MultiCore/Lock.CPP"$
|
||||
CSrvCtrl *ctrl;
|
||||
CSrvCmd *tempc;
|
||||
CTask *seth;
|
||||
if (!(0<=target_cpu<mp_cnt))
|
||||
throw('MultCore');
|
||||
tempc=ACAlloc(sizeof(CSrvCmd));
|
||||
@@ -249,15 +231,17 @@ CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
tempc->flags=flags;
|
||||
tempc->aux1=aux1;
|
||||
tempc->aux2=aux2;
|
||||
tempc->ctrl=ctrl=&cpu_structs[target_cpu].seth_task->srv_ctrl;
|
||||
seth=cpu_structs[target_cpu].seth_task;
|
||||
tempc->ctrl=ctrl=&seth->srv_ctrl;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&ctrl->flags,SVCRf_LOCKED))
|
||||
Yield;
|
||||
if (ctrl->next_waiting==ctrl && LBtr(&seth->task_flags,TASKf_AWAITING_MSG))
|
||||
MPInt(I_WAKE,target_cpu);
|
||||
QueIns(tempc,ctrl->last_waiting);
|
||||
LBtr(&ctrl->flags,SVCRf_LOCKED);
|
||||
POPFD
|
||||
MPWake(target_cpu);
|
||||
return tempc;
|
||||
}
|
||||
|
||||
@@ -360,11 +344,9 @@ U0 Core0StartMP()
|
||||
}
|
||||
|
||||
//Make sure they're all up-and-running
|
||||
for (i=1;i<my_mp_cnt;i++) {
|
||||
c=&cpu_structs[i];
|
||||
while (!Bt(&c->cpu_flags,CPUf_SETH_SLEEP))
|
||||
PAUSE
|
||||
}
|
||||
for (i=1;i<my_mp_cnt;i++)
|
||||
while (!Bt(&cpu_structs[i].seth_task->task_flags,TASKf_AWAITING_MSG))
|
||||
PAUSE;
|
||||
|
||||
POPFD
|
||||
mp_cnt=my_mp_cnt; //Finalize cnt
|
||||
|
||||
+4
-21
@@ -167,29 +167,12 @@ _TASK_END_NOW::
|
||||
_YIELD::
|
||||
PUSHFD
|
||||
TEST U8 [SYS_SEMAS+SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE],1
|
||||
JNZ @@05 //If single user, don't change task.
|
||||
|
||||
CLI
|
||||
PUSH RSI
|
||||
XOR RSI,RSI
|
||||
MOV RSI,FS:CTask.addr[RSI]
|
||||
CMP U64 CTask.next_task[RSI],RSI
|
||||
JNE @@15 //Jmp if not just one task on core.
|
||||
|
||||
PUSH RAX
|
||||
MOV RAX,U64 [&cnts.jiffies]
|
||||
CMP U64 CTask.wake_jiffy[RSI],RAX
|
||||
JG @@10 //If needs to sleep, jmp and swap-out.
|
||||
|
||||
POP RAX
|
||||
POP RSI
|
||||
@@05: POPFD
|
||||
JZ @@05
|
||||
POPFD //If single user, don't change task.
|
||||
RET
|
||||
|
||||
@@10: POP RAX
|
||||
@@15: POP RSI
|
||||
@@05: CLI
|
||||
CALL TASK_CONTEXT_SAVE
|
||||
|
||||
MOV EBX,U32 _RET
|
||||
MOV U64 CTask.rip[RSI],RBX
|
||||
POP U64 CTask.rflags[RSI]
|
||||
@@ -203,7 +186,7 @@ RESTORE_RSI_TASK:
|
||||
|
||||
RESTORE_RSI_TASK2:
|
||||
@@20: BT U64 CTask.task_flags[RSI],TASKf_KILL_TASK
|
||||
JC I32 END_RSI_TASK
|
||||
JC END_RSI_TASK
|
||||
TEST U64 CTask.task_flags[RSI],
|
||||
1<<TASKf_AWAITING_MSG|1<<TASKf_SUSPENDED
|
||||
JNZ @@25
|
||||
|
||||
+8
-11
@@ -264,10 +264,10 @@ U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0)
|
||||
#define SCR_CONT 1
|
||||
#define SCR_EXIT 2
|
||||
|
||||
I64 SrvCmdRun(I64 run_flags,CSrvCmd *tempc)
|
||||
{
|
||||
CSrvCtrl *ctrl=tempc->ctrl;
|
||||
CTask *master;
|
||||
I64 SrvCmdRunOne(I64 run_flags,CSrvCtrl *ctrl)
|
||||
{//Called with ctrl->flags,SVCRf_LOCKED.
|
||||
CSrvCmd *tempc=ctrl->next_waiting;
|
||||
CTask *master;
|
||||
I64 result,flags=tempc->flags,old_flags=GetRFlags;
|
||||
if (Bt(&flags,SVCf_EXIT_ON_COMPLETE))
|
||||
result=SCR_EXIT;
|
||||
@@ -350,18 +350,13 @@ I64 SrvCmdRun(I64 run_flags,CSrvCmd *tempc)
|
||||
I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL)
|
||||
{//Handle all waiting cmds and return.
|
||||
I64 cnt=0,old_flags=GetRFlags;
|
||||
CSrvCmd *tempc,*tempc1;
|
||||
if (!task) task=Fs;
|
||||
while (TRUE) {
|
||||
CLI
|
||||
while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED))
|
||||
PAUSE
|
||||
tempc1=&task->srv_ctrl.next_waiting;
|
||||
tempc=tempc1->next;
|
||||
if (tempc==tempc1)
|
||||
goto sch_done;
|
||||
else
|
||||
switch (SrvCmdRun(run_flags,tempc)) {
|
||||
if (task->srv_ctrl.next_waiting!=&task->srv_ctrl)
|
||||
switch (SrvCmdRunOne(run_flags,&task->srv_ctrl)) {
|
||||
case SCR_CONT:
|
||||
cnt++;
|
||||
break;
|
||||
@@ -370,6 +365,8 @@ I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL)
|
||||
case SCR_DONE:
|
||||
goto sch_done;
|
||||
}
|
||||
else
|
||||
goto sch_done;
|
||||
}
|
||||
sch_done:
|
||||
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
|
||||
|
||||
@@ -21,6 +21,7 @@ U0 SPutChar(U8 **_dst,U8 ch,U8 **_buf)
|
||||
if (i>=MSize(buf)) {
|
||||
buf=MAlloc(i<<1+1);
|
||||
MemCpy(buf,*_buf,i);
|
||||
Free(*_buf);
|
||||
dst=buf+i;
|
||||
*_buf=buf;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user