mirror of https://github.com/FDOS/kernel.git
From Eric Luttmann:
fix for multi-segment device drivers; preserve rq_endaddr between init calls for the same driver. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@722 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
8db46073f9
commit
a0f4465045
|
@ -1384,8 +1384,15 @@ STATIC BOOL LoadDevice(BYTE * pLine, char FAR *top, COUNT mode)
|
||||||
|
|
||||||
dhp = MK_FP(base, 0);
|
dhp = MK_FP(base, 0);
|
||||||
|
|
||||||
|
/* NOTE - Modification for multisegmented device drivers: */
|
||||||
|
/* In order to emulate the functionallity experienced with other */
|
||||||
|
/* DOS operating systems, the original 'top' end address is */
|
||||||
|
/* updated with the end address returned from the INIT request. */
|
||||||
|
/* The updated end address is then used when issuing the next */
|
||||||
|
/* INIT request for the following device driver within the file */
|
||||||
|
|
||||||
for (next_dhp = NULL; FP_OFF(next_dhp) != 0xffff &&
|
for (next_dhp = NULL; FP_OFF(next_dhp) != 0xffff &&
|
||||||
(result = init_device(dhp, szBuf, mode, top)) == SUCCESS;
|
(result = init_device(dhp, szBuf, mode, &top)) == SUCCESS;
|
||||||
dhp = next_dhp)
|
dhp = next_dhp)
|
||||||
{
|
{
|
||||||
next_dhp = MK_FP(FP_SEG(dhp), FP_OFF(dhp->dh_next));
|
next_dhp = MK_FP(FP_SEG(dhp), FP_OFF(dhp->dh_next));
|
||||||
|
|
|
@ -188,7 +188,7 @@ VOID ASMCFUNC FAR cpm_entry(void);
|
||||||
/* main.c */
|
/* main.c */
|
||||||
VOID ASMCFUNC FreeDOSmain(void);
|
VOID ASMCFUNC FreeDOSmain(void);
|
||||||
BOOL init_device(struct dhdr FAR * dhp, char * cmdLine,
|
BOOL init_device(struct dhdr FAR * dhp, char * cmdLine,
|
||||||
COUNT mode, char FAR *top);
|
COUNT mode, char FAR **top);
|
||||||
VOID init_fatal(BYTE * err_msg);
|
VOID init_fatal(BYTE * err_msg);
|
||||||
|
|
||||||
/* prf.c */
|
/* prf.c */
|
||||||
|
|
|
@ -230,7 +230,7 @@ STATIC void init_kernel(void)
|
||||||
/* we can read config.sys later. */
|
/* we can read config.sys later. */
|
||||||
LoL->lastdrive = Config.cfgLastdrive;
|
LoL->lastdrive = Config.cfgLastdrive;
|
||||||
|
|
||||||
/* init_device((struct dhdr FAR *)&blk_dev, NULL, 0, ram_top); */
|
/* init_device((struct dhdr FAR *)&blk_dev, NULL, 0, &ram_top); */
|
||||||
blk_dev.dh_name[0] = dsk_init();
|
blk_dev.dh_name[0] = dsk_init();
|
||||||
|
|
||||||
PreConfig();
|
PreConfig();
|
||||||
|
@ -485,7 +485,7 @@ STATIC VOID update_dcb(struct dhdr FAR * dhp)
|
||||||
/* If cmdLine is NULL, this is an internal driver */
|
/* If cmdLine is NULL, this is an internal driver */
|
||||||
|
|
||||||
BOOL init_device(struct dhdr FAR * dhp, char *cmdLine, COUNT mode,
|
BOOL init_device(struct dhdr FAR * dhp, char *cmdLine, COUNT mode,
|
||||||
char FAR *r_top)
|
char FAR **r_top)
|
||||||
{
|
{
|
||||||
request rq;
|
request rq;
|
||||||
char name[8];
|
char name[8];
|
||||||
|
@ -517,7 +517,7 @@ BOOL init_device(struct dhdr FAR * dhp, char *cmdLine, COUNT mode,
|
||||||
rq.r_status = 0;
|
rq.r_status = 0;
|
||||||
rq.r_command = C_INIT;
|
rq.r_command = C_INIT;
|
||||||
rq.r_length = sizeof(request);
|
rq.r_length = sizeof(request);
|
||||||
rq.r_endaddr = r_top;
|
rq.r_endaddr = *r_top;
|
||||||
rq.r_bpbptr = (void FAR *)(cmdLine ? cmdLine : "\n");
|
rq.r_bpbptr = (void FAR *)(cmdLine ? cmdLine : "\n");
|
||||||
rq.r_firstunit = LoL->nblkdev;
|
rq.r_firstunit = LoL->nblkdev;
|
||||||
|
|
||||||
|
@ -546,6 +546,15 @@ BOOL init_device(struct dhdr FAR * dhp, char *cmdLine, COUNT mode,
|
||||||
KernelAllocPara(FP_SEG(rq.r_endaddr) + (FP_OFF(rq.r_endaddr) + 15)/16
|
KernelAllocPara(FP_SEG(rq.r_endaddr) + (FP_OFF(rq.r_endaddr) + 15)/16
|
||||||
- FP_SEG(dhp), 'D', name, mode);
|
- FP_SEG(dhp), 'D', name, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Another fix for multisegmented device drivers: */
|
||||||
|
/* To help emulate the functionallity experienced with other DOS */
|
||||||
|
/* operating systems when calling multiple device drivers in a */
|
||||||
|
/* single driver file, save the end address returned from the */
|
||||||
|
/* last INIT call which will then be passed as the end address */
|
||||||
|
/* for the next INIT call. */
|
||||||
|
|
||||||
|
*r_top = (char FAR *)rq.r_endaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(dhp->dh_attr & ATTR_CHAR) && (rq.r_nunits != 0))
|
if (!(dhp->dh_attr & ATTR_CHAR) && (rq.r_nunits != 0))
|
||||||
|
@ -569,7 +578,7 @@ STATIC void InitIO(void)
|
||||||
/* Initialize driver chain */
|
/* Initialize driver chain */
|
||||||
setvec(0x29, int29_handler); /* Requires Fast Con Driver */
|
setvec(0x29, int29_handler); /* Requires Fast Con Driver */
|
||||||
do {
|
do {
|
||||||
init_device(device, NULL, 0, lpTop);
|
init_device(device, NULL, 0, &lpTop);
|
||||||
device = device->dh_next;
|
device = device->dh_next;
|
||||||
}
|
}
|
||||||
while (FP_OFF(device) != 0xffff);
|
while (FP_OFF(device) != 0xffff);
|
||||||
|
|
Loading…
Reference in New Issue