mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-21 21:04:43 +02:00
Ioctl optimization using a command table, present both in Tom's and the
unstable kernel. ~83 bytes saved. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1310 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
2faf38e208
commit
f777f91f4c
102
kernel/ioctl.c
102
kernel/ioctl.c
@ -56,9 +56,26 @@ static BYTE *RcsId =
|
|||||||
|
|
||||||
COUNT DosDevIOctl(lregs * r)
|
COUNT DosDevIOctl(lregs * r)
|
||||||
{
|
{
|
||||||
|
static UBYTE cmd [] = {
|
||||||
|
0, 0,
|
||||||
|
/* 0x02 */ C_IOCTLIN,
|
||||||
|
/* 0x03 */ C_IOCTLOUT,
|
||||||
|
/* 0x04 */ C_IOCTLIN,
|
||||||
|
/* 0x05 */ C_IOCTLOUT,
|
||||||
|
/* 0x06 */ C_ISTAT,
|
||||||
|
/* 0x07 */ C_OSTAT,
|
||||||
|
/* 0x08 */ C_REMMEDIA,
|
||||||
|
0, 0, 0,
|
||||||
|
/* 0x0c */ C_GENIOCTL,
|
||||||
|
/* 0x0d */ C_GENIOCTL,
|
||||||
|
/* 0x0e */ C_GETLDEV,
|
||||||
|
/* 0x0f */ C_SETLDEV,
|
||||||
|
/* 0x10 */ C_IOCTLQRY,
|
||||||
|
/* 0x11 */ C_IOCTLQRY,
|
||||||
|
};
|
||||||
|
|
||||||
sft FAR *s;
|
sft FAR *s;
|
||||||
struct dpb FAR *dpbp;
|
struct dpb FAR *dpbp;
|
||||||
COUNT nMode;
|
|
||||||
unsigned attr;
|
unsigned attr;
|
||||||
unsigned char al = r->AL;
|
unsigned char al = r->AL;
|
||||||
|
|
||||||
@ -66,6 +83,7 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
return DE_INVLDFUNC;
|
return DE_INVLDFUNC;
|
||||||
|
|
||||||
/* commonly used, shouldn't harm to do front up */
|
/* commonly used, shouldn't harm to do front up */
|
||||||
|
CharReqHdr.r_command = cmd[r->AL];
|
||||||
if (al == 0x0C || al == 0x0D || al >= 0x10) /* generic or query */
|
if (al == 0x0C || al == 0x0D || al >= 0x10) /* generic or query */
|
||||||
{
|
{
|
||||||
CharReqHdr.r_cat = r->CH; /* category (major) code */
|
CharReqHdr.r_cat = r->CH; /* category (major) code */
|
||||||
@ -139,44 +157,29 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
s->sft_flags_lo = SFT_FDEVICE | r->DL;
|
s->sft_flags_lo = SFT_FDEVICE | r->DL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x02:
|
|
||||||
nMode = C_IOCTLIN;
|
|
||||||
goto IoCharCommon;
|
|
||||||
|
|
||||||
case 0x03:
|
|
||||||
nMode = C_IOCTLOUT;
|
|
||||||
goto IoCharCommon;
|
|
||||||
|
|
||||||
case 0x06:
|
|
||||||
if (flags & SFT_FDEVICE)
|
|
||||||
{
|
|
||||||
nMode = C_ISTAT;
|
|
||||||
goto IoCharCommon;
|
|
||||||
}
|
|
||||||
r->AL = s->sft_posit >= s->sft_size ? 0 : 0xFF;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x07:
|
|
||||||
if (flags & SFT_FDEVICE)
|
|
||||||
{
|
|
||||||
nMode = C_OSTAT;
|
|
||||||
goto IoCharCommon;
|
|
||||||
}
|
|
||||||
r->AL = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x0a:
|
case 0x0a:
|
||||||
r->DX = flags;
|
r->DX = flags;
|
||||||
r->AX = 0;
|
r->AX = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0c:
|
case 0x06:
|
||||||
nMode = C_GENIOCTL;
|
if (!(flags & SFT_FDEVICE))
|
||||||
|
{
|
||||||
|
r->AL = s->sft_posit >= s->sft_size ? 0 : 0xFF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
goto IoCharCommon;
|
goto IoCharCommon;
|
||||||
|
|
||||||
default: /* 0x10 */
|
case 0x07:
|
||||||
nMode = C_IOCTLQRY;
|
if (!(flags & SFT_FDEVICE))
|
||||||
IoCharCommon:
|
{
|
||||||
|
r->AL = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
|
|
||||||
|
default: /* 0x02, 0x03, 0x0c, 0x10 */
|
||||||
|
IoCharCommon:
|
||||||
if ((flags & SFT_FDEVICE) &&
|
if ((flags & SFT_FDEVICE) &&
|
||||||
( (r->AL <= 0x03 && (attr & ATTR_IOCTL))
|
( (r->AL <= 0x03 && (attr & ATTR_IOCTL))
|
||||||
|| r->AL == 0x06 || r->AL == 0x07
|
|| r->AL == 0x06 || r->AL == 0x07
|
||||||
@ -184,7 +187,6 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
|| (r->AL == 0x0c && (attr & ATTR_GENIOCTL))))
|
|| (r->AL == 0x0c && (attr & ATTR_GENIOCTL))))
|
||||||
{
|
{
|
||||||
CharReqHdr.r_unit = 0;
|
CharReqHdr.r_unit = 0;
|
||||||
CharReqHdr.r_command = nMode;
|
|
||||||
execrh((request FAR *) & CharReqHdr, s->sft_dev);
|
execrh((request FAR *) & CharReqHdr, s->sft_dev);
|
||||||
|
|
||||||
if (CharReqHdr.r_status & S_ERROR)
|
if (CharReqHdr.r_status & S_ERROR)
|
||||||
@ -238,19 +240,6 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
|
|
||||||
switch (r->AL)
|
switch (r->AL)
|
||||||
{
|
{
|
||||||
case 0x04:
|
|
||||||
nMode = C_IOCTLIN;
|
|
||||||
goto IoBlockCommon;
|
|
||||||
case 0x05:
|
|
||||||
nMode = C_IOCTLOUT;
|
|
||||||
goto IoBlockCommon;
|
|
||||||
case 0x08:
|
|
||||||
if (attr & ATTR_EXCALLS)
|
|
||||||
{
|
|
||||||
nMode = C_REMMEDIA;
|
|
||||||
goto IoBlockCommon;
|
|
||||||
}
|
|
||||||
return DE_INVLDFUNC;
|
|
||||||
case 0x09:
|
case 0x09:
|
||||||
{
|
{
|
||||||
struct cds FAR *cdsp = get_cds(CharReqHdr.r_unit);
|
struct cds FAR *cdsp = get_cds(CharReqHdr.r_unit);
|
||||||
@ -273,12 +262,14 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0x08:
|
||||||
|
if (!(attr & ATTR_EXCALLS))
|
||||||
|
return DE_INVLDFUNC;
|
||||||
|
/* else fall through */
|
||||||
|
case 0x04:
|
||||||
|
case 0x05:
|
||||||
case 0x0d:
|
case 0x0d:
|
||||||
nMode = C_GENIOCTL;
|
|
||||||
goto IoBlockCommon;
|
|
||||||
case 0x11:
|
case 0x11:
|
||||||
nMode = C_IOCTLQRY;
|
|
||||||
IoBlockCommon:
|
|
||||||
if (r->AL == 0x0D && (r->CX & ~(0x486B-0x084A)) == 0x084A)
|
if (r->AL == 0x0D && (r->CX & ~(0x486B-0x084A)) == 0x084A)
|
||||||
{ /* 084A/484A, 084B/484B, 086A/486A, 086B/486B */
|
{ /* 084A/484A, 084B/484B, 086A/486A, 086B/486B */
|
||||||
r->AX = 0; /* (lock/unlock logical/physical volume) */
|
r->AX = 0; /* (lock/unlock logical/physical volume) */
|
||||||
@ -291,7 +282,6 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
return DE_INVLDFUNC;
|
return DE_INVLDFUNC;
|
||||||
}
|
}
|
||||||
|
|
||||||
CharReqHdr.r_command = nMode;
|
|
||||||
execrh((request FAR *) & CharReqHdr, dpbp->dpb_device);
|
execrh((request FAR *) & CharReqHdr, dpbp->dpb_device);
|
||||||
|
|
||||||
if (CharReqHdr.r_status & S_ERROR)
|
if (CharReqHdr.r_status & S_ERROR)
|
||||||
@ -307,16 +297,10 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
r->AX = CharReqHdr.r_status;
|
r->AX = CharReqHdr.r_status;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0e:
|
default: /* 0x0e, 0x0f */
|
||||||
nMode = C_GETLDEV;
|
|
||||||
goto IoLogCommon;
|
|
||||||
default: /* 0x0f */
|
|
||||||
nMode = C_SETLDEV;
|
|
||||||
IoLogCommon:
|
|
||||||
if (attr & ATTR_GENIOCTL)
|
if (attr & ATTR_GENIOCTL)
|
||||||
{
|
{
|
||||||
|
|
||||||
CharReqHdr.r_command = nMode;
|
|
||||||
execrh((request FAR *) & CharReqHdr, dpbp->dpb_device);
|
execrh((request FAR *) & CharReqHdr, dpbp->dpb_device);
|
||||||
|
|
||||||
if (CharReqHdr.r_status & S_ERROR)
|
if (CharReqHdr.r_status & S_ERROR)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user