TempleOSCDV4.03.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:47:01 +02:00
1 parent 1541d7328d
commit 0f1a4a5d65
115 files changed
+5618 -4863

No files matched your search

+2 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
+196 -167
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -1,6 +1,5 @@
#exe {Cd(__DIR__);};
#include "PageTables"
#include "Mem2Meg"
#include "Mem512"
#include "BlkPool"
#include "MAllocFree"
-180
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+1
View File
@@ -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;
}