kernel, main: add debugger_present variable and skip ints 0, 1, 3, 6
Also adds a CheckDebugger byte to the CONFIG block and support for reading and writing this setting in the SYS CONFIG program. Default is 0 (no check assume absent).
This commit is contained in:
parent
7ff6c06814
commit
49733547f1
@ -46,4 +46,8 @@ typedef struct _KernelConfig {
|
|||||||
unsigned short Version_Revision;
|
unsigned short Version_Revision;
|
||||||
unsigned short Version_Release;
|
unsigned short Version_Release;
|
||||||
|
|
||||||
|
unsigned char CheckDebugger;
|
||||||
|
/* 0 = do not check (assume absent),
|
||||||
|
1 = do check by running breakpoint,
|
||||||
|
2 = assume present */
|
||||||
} KernelConfig;
|
} KernelConfig;
|
||||||
|
@ -76,6 +76,7 @@ Version_Major db 2
|
|||||||
Version_Revision dw 41 ; REVISION_SEQ
|
Version_Revision dw 41 ; REVISION_SEQ
|
||||||
Version_Release dw 1 ; 0=release build, >0=svn#
|
Version_Release dw 1 ; 0=release build, >0=svn#
|
||||||
|
|
||||||
|
CheckDebugger: db 0 ; 0 = no check, 1 = check, 2 = assume present
|
||||||
configend:
|
configend:
|
||||||
kernel_config_size: equ configend - config_signature
|
kernel_config_size: equ configend - config_signature
|
||||||
; must be below-or-equal the size of struct _KernelConfig
|
; must be below-or-equal the size of struct _KernelConfig
|
||||||
@ -253,6 +254,25 @@ extern _InitKernelConfig
|
|||||||
%endif
|
%endif
|
||||||
mov ds, ax ; => init data segment
|
mov ds, ax ; => init data segment
|
||||||
|
|
||||||
|
check_debugger_present:
|
||||||
|
extern _debugger_present
|
||||||
|
|
||||||
|
mov al, 1 ; assume debugger present
|
||||||
|
cmp byte [di - kernel_config_size + (CheckDebugger - config_signature)], 1
|
||||||
|
ja .skip_ints_00_06 ; 2 means assume present
|
||||||
|
jb .absent ; 0 means assume absent
|
||||||
|
clc ; 1 means check
|
||||||
|
int3 ; break to debugger
|
||||||
|
jc .skip_ints_00_06
|
||||||
|
; The debugger should set CY here to indicate its
|
||||||
|
; presence. The flag set is checked later to skip
|
||||||
|
; overwriting the interrupt vectors 00h, 01h, 03h,
|
||||||
|
; and 06h. This logic is taken from lDOS init.
|
||||||
|
.absent:
|
||||||
|
xor ax, ax ; no debugger present
|
||||||
|
.skip_ints_00_06:
|
||||||
|
mov byte [_debugger_present], al
|
||||||
|
|
||||||
jmp _FreeDOSmain
|
jmp _FreeDOSmain
|
||||||
|
|
||||||
%if XCPU != 86
|
%if XCPU != 86
|
||||||
|
@ -69,6 +69,9 @@ __segment DosTextSeg = 0;
|
|||||||
struct lol FAR *LoL = &DATASTART;
|
struct lol FAR *LoL = &DATASTART;
|
||||||
|
|
||||||
struct _KernelConfig InitKernelConfig = { 0xFF };
|
struct _KernelConfig InitKernelConfig = { 0xFF };
|
||||||
|
UBYTE debugger_present = 0xFF; /* initialised in kernel.asm
|
||||||
|
do NOT set 0 here or compiler may
|
||||||
|
move it into bss that we zero out */
|
||||||
|
|
||||||
VOID ASMCFUNC FreeDOSmain(void)
|
VOID ASMCFUNC FreeDOSmain(void)
|
||||||
{
|
{
|
||||||
@ -235,10 +238,10 @@ STATIC void setup_int_vectors(void)
|
|||||||
} vectors[] =
|
} vectors[] =
|
||||||
{
|
{
|
||||||
/* all of these are in the DOS DS */
|
/* all of these are in the DOS DS */
|
||||||
{ 0x0, FP_OFF(int0_handler) }, /* zero divide */
|
{ 0x80 | 0x0, FP_OFF(int0_handler) }, /* zero divide */
|
||||||
{ 0x1, FP_OFF(empty_handler) }, /* single step */
|
{ 0x80 | 0x1, FP_OFF(empty_handler) }, /* single step */
|
||||||
{ 0x3, FP_OFF(empty_handler) }, /* debug breakpoint */
|
{ 0x80 | 0x3, FP_OFF(empty_handler) }, /* debug breakpoint */
|
||||||
{ 0x6, FP_OFF(int6_handler) }, /* invalid opcode */
|
{ 0x80 | 0x6, FP_OFF(int6_handler) }, /* invalid opcode */
|
||||||
{ 0x19, FP_OFF(int19_handler) }, /* BIOS bootstrap loader, vdisk */
|
{ 0x19, FP_OFF(int19_handler) }, /* BIOS bootstrap loader, vdisk */
|
||||||
{ 0x20, FP_OFF(int20_handler) },
|
{ 0x20, FP_OFF(int20_handler) },
|
||||||
{ 0x21, FP_OFF(int21_handler) }, /* primary DOS API */
|
{ 0x21, FP_OFF(int21_handler) }, /* primary DOS API */
|
||||||
@ -264,7 +267,8 @@ STATIC void setup_int_vectors(void)
|
|||||||
setvec(i, empty_handler); /* note: int 31h segment should be DOS DS */
|
setvec(i, empty_handler); /* note: int 31h segment should be DOS DS */
|
||||||
HaltCpuWhileIdle = 0;
|
HaltCpuWhileIdle = 0;
|
||||||
for (pvec = vectors; pvec < vectors + (sizeof vectors/sizeof *pvec); pvec++)
|
for (pvec = vectors; pvec < vectors + (sizeof vectors/sizeof *pvec); pvec++)
|
||||||
setvec(pvec->intno, (intvec)MK_FP(FP_SEG(empty_handler), pvec->handleroff));
|
if ((pvec->intno & 0x80) == 0 || debugger_present == 0)
|
||||||
|
setvec(pvec->intno & 0x7F, (intvec)MK_FP(FP_SEG(empty_handler), pvec->handleroff));
|
||||||
pokeb(0, 0x30 * 4, 0xea);
|
pokeb(0, 0x30 * 4, 0xea);
|
||||||
pokel(0, 0x30 * 4 + 1, (ULONG)cpm_entry);
|
pokel(0, 0x30 * 4 + 1, (ULONG)cpm_entry);
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* merged into SYS by tom ehlert *
|
* merged into SYS by tom ehlert *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
char VERSION[] = "v1.02";
|
char VERSION[] = "v1.03";
|
||||||
char PROGRAM[] = "SYS CONFIG";
|
char PROGRAM[] = "SYS CONFIG";
|
||||||
char KERNEL[] = "KERNEL.SYS";
|
char KERNEL[] = "KERNEL.SYS";
|
||||||
|
|
||||||
@ -93,7 +93,8 @@ void showUsage(void)
|
|||||||
printf(" Current Options are: DLASORT=0|1, SHOWDRIVEASSIGNMENT=0|1\n"
|
printf(" Current Options are: DLASORT=0|1, SHOWDRIVEASSIGNMENT=0|1\n"
|
||||||
" SKIPCONFIGSECONDS=#, FORCELBA=0|1\n"
|
" SKIPCONFIGSECONDS=#, FORCELBA=0|1\n"
|
||||||
" GLOBALENABLELBASUPPORT=0|1\n"
|
" GLOBALENABLELBASUPPORT=0|1\n"
|
||||||
" BootHarddiskSeconds=0|seconds to wait\n");
|
" BootHarddiskSeconds=0|seconds to wait\n"
|
||||||
|
" CheckDebugger=0|1|2\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* simply reads in current configuration values, exiting program
|
/* simply reads in current configuration values, exiting program
|
||||||
@ -215,6 +216,13 @@ void displayConfigSettings(KernelConfig * cfg)
|
|||||||
cfg->BootHarddiskSeconds);
|
cfg->BootHarddiskSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg->ConfigSize >= 13)
|
||||||
|
{
|
||||||
|
printf
|
||||||
|
("CheckDebugger=%d : *0=no, 1=check, 2=assume\n",
|
||||||
|
cfg->CheckDebugger);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0 /* we assume that SYS is as current as the kernel */
|
#if 0 /* we assume that SYS is as current as the kernel */
|
||||||
|
|
||||||
/* Print value any options added that are unknown as hex dump */
|
/* Print value any options added that are unknown as hex dump */
|
||||||
@ -482,6 +490,11 @@ int FDKrnConfigMain(int argc, char **argv)
|
|||||||
setSByteOption(&(cfg.BootHarddiskSeconds),
|
setSByteOption(&(cfg.BootHarddiskSeconds),
|
||||||
cptr, 0, 127, &updates, "BootHarddiskSeconds");
|
cptr, 0, 127, &updates, "BootHarddiskSeconds");
|
||||||
}
|
}
|
||||||
|
else if (memicmp(argptr, "CheckDebugger", 5) == 0)
|
||||||
|
{
|
||||||
|
setByteOption(&(cfg.CheckDebugger),
|
||||||
|
cptr, 2, &updates, "CheckDebugger");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
illegal_arg:
|
illegal_arg:
|
||||||
|
Loading…
Reference in New Issue
Block a user