Optional support for modifying CONFIG via memdisk args, requires MEMDISK_ARGS and 386 defined to be included.

git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1634 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Kenneth J Davis 2011-06-21 02:17:09 +00:00
parent a108714c31
commit 4499bd29b3
4 changed files with 226 additions and 4 deletions

View File

@ -108,6 +108,7 @@
*/*/kernel/lfnapi.c */*/kernel/lfnapi.c
*/*/kernel/ludivmul.inc */*/kernel/ludivmul.inc
*/*/kernel/main.c */*/kernel/main.c
*/*/kernel/memdisk.asm
*/*/kernel/memmgr.c */*/kernel/memmgr.c
*/*/kernel/misc.c */*/kernel/misc.c
*/*/kernel/network.c */*/kernel/network.c

View File

@ -599,16 +599,99 @@ STATIC void umb_init(void)
} }
} }
/* we require 386, so only supported for 386+ compiled kernels */
#if defined(MEMDISK_ARGS)
#ifndef I386
#undef MEMDISK_ARGS
#endif
#endif
#ifdef MEMDISK_ARGS
struct memdiskinfo {
UWORD bytes; /* Total size of this structure, value >= 26 */
UBYTE version_minor; /* Memdisk minor version */
UBYTE version; /* Memdisk major version */
UDWORD base; /* Pointer to disk data in high memory */
UDWORD size; /* Size of disk in 512 byte sectors */
char FAR * cmdline; /* Command line */
ADDRESS oldint13; /* Old INT 13h */
ADDRESS oldint15; /* Old INT 15h */
UWORD olddosmem; /* Amount of DOS memory before Memdisk loaded */
UBYTE boot_id; /* major >= 3, boot loader ID */
UBYTE unused;
UWORD DPT_offset; /* >= 3.71, ES based offset to installed DPT, +16 is Old INT 1Eh */
};
/* query_memdisk() based on similar subroutine in Eric Auer's public domain getargs.asm which is based on IFMEMDSK */
struct memdiskinfo FAR * ASMCFUNC query_memdisk(UBYTE drive);
#endif
VOID DoConfig(int nPass) VOID DoConfig(int nPass)
{ {
COUNT nFileDesc; COUNT nFileDesc;
BYTE *pLine; BYTE *pLine;
BOOL bEof; BOOL bEof;
#ifdef MEMDISK_ARGS
/* check if MEMDISK used for LoL->BootDrive, if so check for special appended arguments */
struct memdiskinfo FAR *mdsk;
BYTE FAR *mdsk_cfg = NULL;
UBYTE drv = (LoL->BootDrive < 3)?0x0:0x80; /* 1=A,2=B,3=C */
mdsk = query_memdisk(drv);
#endif
if (nPass==0) if (nPass==0)
{
HaltCpuWhileIdle = 0; /* init to "no HLT while idle" */ HaltCpuWhileIdle = 0; /* init to "no HLT while idle" */
#ifdef MEMDISK_ARGS
if (mdsk != NULL)
{
printf("MEMDISK version %u.%02u (%lu sectors)\n", mdsk->version, mdsk->version_minor, mdsk->size);
DebugPrintf(("MEMDISK args:{%S} bootdrive=[%0Xh]\n", mdsk->cmdline, (unsigned int)drv));
}
#endif
}
#ifdef MEMDISK_ARGS
if (mdsk != NULL)
{
/* scan for FD= */
/* when done mdsk->cmdline points to { character or assume no valid CONFIG options */
for (mdsk_cfg=mdsk->cmdline; *mdsk_cfg; ++mdsk_cfg)
{
if (*mdsk_cfg != ' ') continue;
++mdsk_cfg;
if (*mdsk_cfg != 'F') goto goback1;
++mdsk_cfg;
if (*mdsk_cfg != 'D') goto goback2;
++mdsk_cfg;
if (*mdsk_cfg != '=') goto goback3;
++mdsk_cfg;
break;
goback3:
--mdsk_cfg;
goback2:
--mdsk_cfg;
goback1:
--mdsk_cfg;
}
/* if FD= was not found then flag as no extra CONFIG lines */
if (!*mdsk_cfg) mdsk_cfg = NULL;
}
else
{
DebugPrintf(("MEMDISK not detected! bootdrive=[%0Xh]\n", (unsigned int)drv));
}
#endif
/* Check to see if we have a config.sys file. If not, just */ /* Check to see if we have a config.sys file. If not, just */
/* exit since we don't force the user to have one. */ /* exit since we don't force the user to have one (but 1st */
/* also process MEMDISK passed config options if present). */
if ((nFileDesc = open("fdconfig.sys", 0)) >= 0) if ((nFileDesc = open("fdconfig.sys", 0)) >= 0)
{ {
DebugPrintf(("Reading FDCONFIG.SYS...\n")); DebugPrintf(("Reading FDCONFIG.SYS...\n"));
@ -619,10 +702,18 @@ VOID DoConfig(int nPass)
if ((nFileDesc = open("config.sys", 0)) < 0) if ((nFileDesc = open("config.sys", 0)) < 0)
{ {
DebugPrintf(("CONFIG.SYS not found\n")); DebugPrintf(("CONFIG.SYS not found\n"));
#ifdef MEMDISK_ARGS
if (mdsk_cfg != NULL)
bEof = TRUE;
else
#endif
return; return;
} }
else
{
DebugPrintf(("Reading CONFIG.SYS...\n")); DebugPrintf(("Reading CONFIG.SYS...\n"));
} }
}
/* Have one -- initialize. */ /* Have one -- initialize. */
nCfgLine = 0; nCfgLine = 0;
@ -633,12 +724,22 @@ VOID DoConfig(int nPass)
/* do the table lookup and execute the handler for that */ /* do the table lookup and execute the handler for that */
/* function. */ /* function. */
#ifdef MEMDISK_ARGS
for (; !bEof || (mdsk_cfg != NULL); nCfgLine++)
#else
for (; !bEof; nCfgLine++) for (; !bEof; nCfgLine++)
#endif
{ {
struct table *pEntry; struct table *pEntry;
pLineStart = szLine; pLineStart = szLine;
#ifdef MEMDISK_ARGS
if (!bEof)
{
#endif
/* read in a single line, \n or ^Z terminated */ /* read in a single line, \n or ^Z terminated */
for (pLine = szLine;;) for (pLine = szLine;;)
@ -663,9 +764,47 @@ VOID DoConfig(int nPass)
pLine++; pLine++;
} }
#ifdef MEMDISK_ARGS
}
else if (mdsk_cfg != NULL)
{
pLine = szLine;
/* copy data to near buffer skipping { and } */
if (*mdsk_cfg != '{') /* if not at start of line */
{
mdsk_cfg = NULL; /* no longer need data, so set to NULL to flag done */
}
else
{
for (pLine = szLine, mdsk_cfg++; *mdsk_cfg; mdsk_cfg++, pLine++)
{
/* copy character to near buffer */
*pLine = *mdsk_cfg;
/* ensure we don't copy too much, exceed our buffer size */
if (pLine >= szLine + sizeof(szLine) - 3)
{
CfgFailure(pLine);
printf("error - line overflow line %d \n", nCfgLine);
break;
}
/* if end of this simulated line is found, skip over EOL marker then proceed to process line */
if (*pLine == '}')
{
mdsk_cfg++;
break;
}
}
}
}
#endif
*pLine = 0; *pLine = 0;
pLine = szLine; pLine = szLine;
DebugPrintf(("CONFIG=[%s]\n", pLine));
/* Skip leading white space and get verb. */ /* Skip leading white space and get verb. */
pLine = scan(pLine, szBuf); pLine = scan(pLine, szBuf);

View File

@ -20,7 +20,7 @@ error.obj
OBJS4=break.obj dosfns.obj fatdir.obj fatfs.obj fattab.obj fcbfns.obj \ OBJS4=break.obj dosfns.obj fatdir.obj fatfs.obj fattab.obj fcbfns.obj \
inthndlr.obj inthndlr.obj
OBJS5=ioctl.obj memmgr.obj task.obj newstuff.obj nls.obj network.obj OBJS5=ioctl.obj memmgr.obj task.obj newstuff.obj nls.obj network.obj
OBJS6=prf.obj misc.obj strings.obj syspack.obj lfnapi.obj iasmsupt.obj OBJS6=prf.obj misc.obj strings.obj syspack.obj lfnapi.obj iasmsupt.obj memdisk.obj
OBJS7=main.obj config.obj initoem.obj inithma.obj dyninit.obj iprf.obj \ OBJS7=main.obj config.obj initoem.obj inithma.obj dyninit.obj iprf.obj \
initdisk.obj initclk.obj initdisk.obj initclk.obj
OBJS=$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7) OBJS=$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7)
@ -79,6 +79,7 @@ intr.obj: intr.asm segs.inc $(TARGET).lnk
io.obj: io.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk io.obj: io.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
irqstack.obj: irqstack.asm segs.inc $(TARGET).lnk irqstack.obj: irqstack.asm segs.inc $(TARGET).lnk
kernel.obj: kernel.asm segs.inc ludivmul.inc $(TARGET).lnk kernel.obj: kernel.asm segs.inc ludivmul.inc $(TARGET).lnk
memdisk.obj: memdisk.asm segs.inc $(TARGET).lnk
nls_hc.obj: nls_hc.asm segs.inc $(TARGET).lnk nls_hc.obj: nls_hc.asm segs.inc $(TARGET).lnk
nlssupt.obj: nlssupt.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk nlssupt.obj: nlssupt.asm segs.inc $(HDR)stacks.inc $(TARGET).lnk
printer.obj: printer.asm io.inc $(TARGET).lnk printer.obj: printer.asm io.inc $(TARGET).lnk

81
kernel/memdisk.asm Normal file
View File

@ -0,0 +1,81 @@
; File:
; memdisk.asm
; Description:
; Query for memdisk provided config.sys parameters
;
; DOS-C
; Copyright (c) 2011
; FreeDOS
; All Rights Reserved
;
; This file is part of DOS-C.
;
; DOS-C is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version
; 2, or (at your option) any later version.
;
; DOS-C is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
; the GNU General Public License for more details.
;
;
%if XCPU == 386 ; requires 386+ registers, until CPU check implemented only allow for 386 builds
%include "segs.inc"
segment INIT_TEXT
CPU 386
;*********************************************************************
;
; query_memdisk() based on similar subroutine in Eric Auer's public domain getargs.asm which is based on IFMEMDSK
; input: drive (in AL) to query if memdisk provided disk
; output: a far * to a memdiskinfo structure as defined by memdisk (see config.c)
; struct memdiskinfo FAR * query_memdisk(UBYTE drive);
global _query_memdisk
_query_memdisk:
; save registers, assumes enough space on stack & valid stack frame setup, ax & dx return values
push es
push di
push ebx
push ecx
push edx ; we only care about high word
push eax ; we only care about high word
mov dl, al ; drive number (only argument, assumed to be in AL)
mov eax,454d0800h ; magic1 + AH=8 (get geometry)
mov ecx,444d0000h ; magic2
mov edx,53490000h ; magic3 +
mov ebx,3f4b0000h ; magic4
int 13h ; BIOS DISK API
shr eax,16 ; ignore AX
shr ebx,16 ; ignore BX
shr ecx,16 ; ignore CX (geometry C/S)
shr edx,16 ; ignore DX (geometry H in DH)
cmp ax,4d21h ; magic5
jnz nomemdisk
cmp cx,4d45h ; magic6
jnz nomemdisk
cmp dx,4944h ; magic7
jnz nomemdisk
cmp bx,4b53h ; magic8
jnz nomemdisk
jmp cleanup
nomemdisk:
xor di, di ; return NULL;
mov es, di
cleanup:
pop eax
pop edx
mov ax, di ; return MK_FP(es, di);
mov dx, es
pop ecx
pop ebx
pop di
pop es
retn
%endif