From 35789061ba485a4c292d58177547bf502dd94e75 Mon Sep 17 00:00:00 2001 From: marco Date: Mon, 22 Jan 2001 07:25:10 +0000 Subject: [PATCH] * IOPERM for FreeBSD. Port routines moved from linsysca to Unix again . --- rtl/freebsd/sysnr.inc | 9 +- rtl/unix/bsdsysca.inc | 76 +++++++++++- rtl/unix/linsysca.inc | 271 +---------------------------------------- rtl/unix/unix.pp | 276 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 357 insertions(+), 275 deletions(-) diff --git a/rtl/freebsd/sysnr.inc b/rtl/freebsd/sysnr.inc index d8e62d9545..05c5ec6eec 100644 --- a/rtl/freebsd/sysnr.inc +++ b/rtl/freebsd/sysnr.inc @@ -117,7 +117,7 @@ const syscall_nr_getdomainname =162; syscall_nr_setdomainname =163; syscall_nr_uname =164; - syscall_nr_sysarch =165; + syscall_nr_rtprio =166; syscall_nr_semsys =169; syscall_nr_msgsys =170; @@ -242,7 +242,7 @@ syscall_nr_getdirentries =196; } {More or less checked BSD syscalls} - + syscall_nr_sysarch = 165; syscall_nr_accept = 30; syscall_nr_access = 33; syscall_nr_bind = 104; @@ -316,7 +316,10 @@ syscall_nr_getdirentries =196; { $Log$ - Revision 1.3 2000-10-26 23:00:12 peter + Revision 1.4 2001-01-22 07:25:10 marco + * IOPERM for FreeBSD. Port routines moved from linsysca to Unix again . + + Revision 1.3 2000/10/26 23:00:12 peter * fixes merges Revision 1.2 2000/09/18 13:42:35 marco diff --git a/rtl/unix/bsdsysca.inc b/rtl/unix/bsdsysca.inc index 8cf8d479b5..69963e9384 100644 --- a/rtl/unix/bsdsysca.inc +++ b/rtl/unix/bsdsysca.inc @@ -681,9 +681,83 @@ asm popl %esi end; + +{ + * Architecture specific syscalls (i386) using the SYSARCH pseudo call +} + +{$packrecords C} + +TYPE uint=CARDINAL; + +CONST + I386_GET_LDT =0; + I386_SET_LDT =1; + { I386_IOPL } + I386_GET_IOPERM =3; + I386_SET_IOPERM =4; + { xxxxx } + I386_VM86 =6; + +{ +type i386_ldt_args = record + int start : longint; + union descriptor *descs; + int num; + end; +} +type + i386_ioperm_args = record + start : uint; + length : uint; + enable : longint; + end; + + + i386_vm86_args = record + sub_op : longint; { sub-operation to perform } + sub_args : pchar; { args } + end; + + sysarch_args = record + op : longint; + parms : pchar; + end; + +{ +int i386_get_ldt __P((int, union descriptor *, int)); +int i386_set_ldt __P((int, union descriptor *, int)); +int i386_get_ioperm __P((unsigned int, unsigned int *, int *)); +int i386_set_ioperm __P((unsigned int, unsigned int, int)); +int i386_vm86 __P((int, void *)); +int i386_set_watch __P((int watchnum, unsigned int watchaddr, int size, + int access, struct dbreg * d)); +int i386_clr_watch __P((int watchnum, struct dbreg * d)); +} + +Function IOPerm(From,Num:CARDINAL;Value:Longint):boolean; + +var sg : i386_ioperm_args; + sa : sysarch_args; + +begin + sg.start:=From; + sg.length:=Num; + sg.enable:=value; + sa.op:=i386_SET_IOPERM; + sa.parms:=@sg; + IOPerm:=do_syscall(syscall_nr_sysarch,longint(@sa))=0; + LinuxError:=ErrNo; +end; + + + { $Log$ - Revision 1.3 2000-10-26 22:51:12 peter + Revision 1.4 2001-01-22 07:25:10 marco + * IOPERM for FreeBSD. Port routines moved from linsysca to Unix again . + + Revision 1.3 2000/10/26 22:51:12 peter * nano sleep (merged) Revision 1.2 2000/09/18 13:14:50 marco diff --git a/rtl/unix/linsysca.inc b/rtl/unix/linsysca.inc index 39b7187914..ad22d560d5 100644 --- a/rtl/unix/linsysca.inc +++ b/rtl/unix/linsysca.inc @@ -924,276 +924,13 @@ begin LinuxError:=Errno; end; -{$IFDEF I386} - -Procedure WritePort (Port : Longint; Value : Byte); -{ - Writes 'Value' to port 'Port' -} -begin - asm - movl port,%edx - movb value,%al - outb %al,%dx - end ['EAX','EDX']; -end; - -Procedure WritePort (Port : Longint; Value : Word); -{ - Writes 'Value' to port 'Port' -} - -begin - asm - movl port,%edx - movw value,%ax - outw %ax,%dx - end ['EAX','EDX']; -end; - - - -Procedure WritePort (Port : Longint; Value : Longint); -{ - Writes 'Value' to port 'Port' -} - -begin - asm - movl port,%edx - movl value,%eax - outl %eax,%dx - end ['EAX','EDX']; -end; - - -Procedure WritePortB (Port : Longint; Value : Byte); -{ - Writes 'Value' to port 'Port' -} -begin - asm - movl port,%edx - movb value,%al - outb %al,%dx - end ['EAX','EDX']; -end; - -Procedure WritePortW (Port : Longint; Value : Word); -{ - Writes 'Value' to port 'Port' -} - -begin - asm - movl port,%edx - movw value,%ax - outw %ax,%dx - end ['EAX','EDX']; -end; - - - -Procedure WritePortL (Port : Longint; Value : Longint); -{ - Writes 'Value' to port 'Port' -} - -begin - asm - movl port,%edx - movl value,%eax - outl %eax,%dx - end ['EAX','EDX']; -end; - - - -Procedure WritePortl (Port : Longint; Var Buf; Count: longint); -{ - Writes 'Count' longints from 'Buf' to Port -} -begin - asm - movl count,%ecx - movl buf,%esi - movl port,%edx - cld - rep - outsl - end ['ECX','ESI','EDX']; -end; - - - -Procedure WritePortW (Port : Longint; Var Buf; Count: longint); -{ - Writes 'Count' words from 'Buf' to Port -} -begin - asm - movl count,%ecx - movl buf,%esi - movl port,%edx - cld - rep - outsw - end ['ECX','ESI','EDX']; -end; - - - -Procedure WritePortB (Port : Longint; Var Buf; Count: longint); -{ - Writes 'Count' bytes from 'Buf' to Port -} -begin - asm - movl count,%ecx - movl buf,%esi - movl port,%edx - cld - rep - outsb - end ['ECX','ESI','EDX']; -end; - - - -Procedure ReadPort (Port : Longint; Var Value : Byte); -{ - Reads 'Value' from port 'Port' -} -begin - asm - movl port,%edx - inb %dx,%al - movl value,%edx - movb %al,(%edx) - end ['EAX','EDX']; -end; - - - -Procedure ReadPort (Port : Longint; Var Value : Word); -{ - Reads 'Value' from port 'Port' -} -begin - asm - movl port,%edx - inw %dx,%ax - movl value,%edx - movw %ax,(%edx) - end ['EAX','EDX']; -end; - - - -Procedure ReadPort (Port : Longint; Var Value : Longint); -{ - Reads 'Value' from port 'Port' -} -begin - asm - movl port,%edx - inl %dx,%eax - movl value,%edx - movl %eax,(%edx) - end ['EAX','EDX']; -end; - - - -function ReadPortB (Port : Longint): Byte; assembler; -{ - Reads a byte from port 'Port' -} - -asm - xorl %eax,%eax - movl port,%edx - inb %dx,%al -end ['EAX','EDX']; - - - -function ReadPortW (Port : Longint): Word; assembler; -{ - Reads a word from port 'Port' -} -asm - xorl %eax,%eax - movl port,%edx - inw %dx,%ax -end ['EAX','EDX']; - - - -function ReadPortL (Port : Longint): LongInt; assembler; -{ - Reads a LongInt from port 'Port' -} -asm - movl port,%edx - inl %dx,%eax -end ['EAX','EDX']; - - - -Procedure ReadPortL (Port : Longint; Var Buf; Count: longint); -{ - Reads 'Count' longints from port 'Port' to 'Buf'. -} -begin - asm - movl count,%ecx - movl buf,%edi - movl port,%edx - cld - rep - insl - end ['ECX','EDI','EDX']; -end; - - - -Procedure ReadPortW (Port : Longint; Var Buf; Count: longint); -{ - Reads 'Count' words from port 'Port' to 'Buf'. -} -begin - asm - movl count,%ecx - movl buf,%edi - movl port,%edx - cld - rep - insw - end ['ECX','EDI','EDX']; -end; - - - -Procedure ReadPortB (Port : Longint; Var Buf; Count: longint); -{ - Reads 'Count' bytes from port 'Port' to 'Buf'. -} -begin - asm - movl count,%ecx - movl buf,%edi - movl port,%edx - cld - rep - insb - end ['ECX','EDI','EDX']; -end; -{$ENDIF} { $Log$ - Revision 1.5 2000-12-28 20:50:04 peter + Revision 1.6 2001-01-22 07:25:10 marco + * IOPERM for FreeBSD. Port routines moved from linsysca to Unix again . + + Revision 1.5 2000/12/28 20:50:04 peter * merged fixes from 1.0.x Revision 1.4 2000/10/26 22:51:12 peter diff --git a/rtl/unix/unix.pp b/rtl/unix/unix.pp index aa6ddb2667..1731f3fdaf 100644 --- a/rtl/unix/unix.pp +++ b/rtl/unix/unix.pp @@ -413,9 +413,8 @@ function MUnMap (P : Pointer; Size : Longint) : Boolean; Port IO functions ***************************} -{$ifndef BSD} Function IOperm (From,Num : Cardinal; Value : Longint) : boolean; -{$IFDEF I386} +{$ifdef i386} Procedure WritePort (Port : Longint; Value : Byte); Procedure WritePort (Port : Longint; Value : Word); Procedure WritePort (Port : Longint; Value : Longint); @@ -435,7 +434,6 @@ Procedure ReadPortL (Port : Longint; Var Buf; Count: longint); Procedure ReadPortW (Port : Longint; Var Buf; Count: longint); Procedure ReadPortB (Port : Longint; Var Buf; Count: longint); {$endif} -{$endif} {************************** Utility functions @@ -2617,6 +2615,273 @@ end; Memory functions --------------------------------} +{$IFDEF I386} + +Procedure WritePort (Port : Longint; Value : Byte); +{ + Writes 'Value' to port 'Port' +} +begin + asm + movl port,%edx + movb value,%al + outb %al,%dx + end ['EAX','EDX']; +end; + +Procedure WritePort (Port : Longint; Value : Word); +{ + Writes 'Value' to port 'Port' +} + +begin + asm + movl port,%edx + movw value,%ax + outw %ax,%dx + end ['EAX','EDX']; +end; + + + +Procedure WritePort (Port : Longint; Value : Longint); +{ + Writes 'Value' to port 'Port' +} + +begin + asm + movl port,%edx + movl value,%eax + outl %eax,%dx + end ['EAX','EDX']; +end; + + +Procedure WritePortB (Port : Longint; Value : Byte); +{ + Writes 'Value' to port 'Port' +} +begin + asm + movl port,%edx + movb value,%al + outb %al,%dx + end ['EAX','EDX']; +end; + +Procedure WritePortW (Port : Longint; Value : Word); +{ + Writes 'Value' to port 'Port' +} + +begin + asm + movl port,%edx + movw value,%ax + outw %ax,%dx + end ['EAX','EDX']; +end; + + + +Procedure WritePortL (Port : Longint; Value : Longint); +{ + Writes 'Value' to port 'Port' +} + +begin + asm + movl port,%edx + movl value,%eax + outl %eax,%dx + end ['EAX','EDX']; +end; + + + +Procedure WritePortl (Port : Longint; Var Buf; Count: longint); +{ + Writes 'Count' longints from 'Buf' to Port +} +begin + asm + movl count,%ecx + movl buf,%esi + movl port,%edx + cld + rep + outsl + end ['ECX','ESI','EDX']; +end; + + + +Procedure WritePortW (Port : Longint; Var Buf; Count: longint); +{ + Writes 'Count' words from 'Buf' to Port +} +begin + asm + movl count,%ecx + movl buf,%esi + movl port,%edx + cld + rep + outsw + end ['ECX','ESI','EDX']; +end; + + + +Procedure WritePortB (Port : Longint; Var Buf; Count: longint); +{ + Writes 'Count' bytes from 'Buf' to Port +} +begin + asm + movl count,%ecx + movl buf,%esi + movl port,%edx + cld + rep + outsb + end ['ECX','ESI','EDX']; +end; + + + +Procedure ReadPort (Port : Longint; Var Value : Byte); +{ + Reads 'Value' from port 'Port' +} +begin + asm + movl port,%edx + inb %dx,%al + movl value,%edx + movb %al,(%edx) + end ['EAX','EDX']; +end; + + + +Procedure ReadPort (Port : Longint; Var Value : Word); +{ + Reads 'Value' from port 'Port' +} +begin + asm + movl port,%edx + inw %dx,%ax + movl value,%edx + movw %ax,(%edx) + end ['EAX','EDX']; +end; + + + +Procedure ReadPort (Port : Longint; Var Value : Longint); +{ + Reads 'Value' from port 'Port' +} +begin + asm + movl port,%edx + inl %dx,%eax + movl value,%edx + movl %eax,(%edx) + end ['EAX','EDX']; +end; + + + +function ReadPortB (Port : Longint): Byte; assembler; +{ + Reads a byte from port 'Port' +} + +asm + xorl %eax,%eax + movl port,%edx + inb %dx,%al +end ['EAX','EDX']; + + + +function ReadPortW (Port : Longint): Word; assembler; +{ + Reads a word from port 'Port' +} +asm + xorl %eax,%eax + movl port,%edx + inw %dx,%ax +end ['EAX','EDX']; + + + +function ReadPortL (Port : Longint): LongInt; assembler; +{ + Reads a LongInt from port 'Port' +} +asm + movl port,%edx + inl %dx,%eax +end ['EAX','EDX']; + + + +Procedure ReadPortL (Port : Longint; Var Buf; Count: longint); +{ + Reads 'Count' longints from port 'Port' to 'Buf'. +} +begin + asm + movl count,%ecx + movl buf,%edi + movl port,%edx + cld + rep + insl + end ['ECX','EDI','EDX']; +end; + + + +Procedure ReadPortW (Port : Longint; Var Buf; Count: longint); +{ + Reads 'Count' words from port 'Port' to 'Buf'. +} +begin + asm + movl count,%ecx + movl buf,%edi + movl port,%edx + cld + rep + insw + end ['ECX','EDI','EDX']; +end; + + + +Procedure ReadPortB (Port : Longint; Var Buf; Count: longint); +{ + Reads 'Count' bytes from port 'Port' to 'Buf'. +} +begin + asm + movl count,%ecx + movl buf,%edi + movl port,%edx + cld + rep + insb + end ['ECX','EDI','EDX']; +end; +{$ENDIF} + Initialization @@ -2629,7 +2894,10 @@ End. { $Log$ - Revision 1.1 2001-01-21 20:21:41 marco + Revision 1.2 2001-01-22 07:25:10 marco + * IOPERM for FreeBSD. Port routines moved from linsysca to Unix again . + + Revision 1.1 2001/01/21 20:21:41 marco * Rename fest II. Rtl OK Revision 1.6 2000/12/28 20:42:12 peter