Browse Source

* IOPERM for FreeBSD. Port routines moved from linsysca to Unix again .

marco 24 năm trước cách đây
mục cha
commit
35789061ba
4 tập tin đã thay đổi với 357 bổ sung275 xóa
  1. 6 3
      rtl/freebsd/sysnr.inc
  2. 75 1
      rtl/unix/bsdsysca.inc
  3. 4 267
      rtl/unix/linsysca.inc
  4. 272 4
      rtl/unix/unix.pp

+ 6 - 3
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

+ 75 - 1
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

+ 4 - 267
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

+ 272 - 4
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