123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 1997-2004 by the Free Pascal development team
- Some x86 specific stuff. Has to be fixed still for *BSD
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program 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.
- **********************************************************************}
- unit x86;
- interface
- Uses BaseUnix;
- function ReadPortB (Port : Longint): Byte;
- function ReadPortW (Port : Longint): Word;
- function ReadPortL (Port : Longint): Longint;
- Procedure ReadPort (Port : Longint; Var Value : Byte);
- Procedure ReadPort (Port : Longint; Var Value : Longint);
- Procedure ReadPort (Port : Longint; Var Value : Word);
- Procedure ReadPortB (Port : Longint; Var Buf; Count: longint);
- Procedure ReadPortL (Port : Longint; Var Buf; Count: longint);
- Procedure ReadPortW (Port : Longint; Var Buf; Count: longint);
- Procedure WritePort (Port : Longint; Value : Byte);
- Procedure WritePort (Port : Longint; Value : Longint);
- Procedure WritePort (Port : Longint; Value : Word);
- Procedure WritePortB (Port : Longint; Value : Byte);
- Procedure WritePortB (Port : Longint; Var Buf; Count: longint);
- Procedure WritePortL (Port : Longint; Value : Longint);
- Procedure WritePortW (Port : Longint; Value : Word);
- Procedure WritePortW (Port : Longint; Var Buf; Count: longint);
- Procedure WritePortl (Port : Longint; Var Buf; Count: longint);
- Function fpIOperm (From,Num : Cardinal; Value : cint) : cint;
- Function fpIoPL(Level : cint) : cint;
- implementation
- {$ASMMODE ATT}
- Uses Syscall;
- Procedure WritePort (Port : Longint; Value : Byte);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movb value,%al
- outb %al,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movb value,%al
- outb %al,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePort (Port : Longint; Value : Word);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movw value,%ax
- outw %ax,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movw value,%ax
- outw %ax,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePort (Port : Longint; Value : Longint);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movl value,%eax
- outl %eax,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movl value,%eax
- outl %eax,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortB (Port : Longint; Value : Byte);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movb value,%al
- outb %al,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movb value,%al
- outb %al,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortW (Port : Longint; Value : Word);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movw value,%ax
- outw %ax,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movw value,%ax
- outw %ax,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortL (Port : Longint; Value : Longint);
- {
- Writes 'Value' to port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- movl value,%eax
- outl %eax,%dx
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- movl value,%eax
- outl %eax,%dx
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortl (Port : Longint; Var Buf; Count: longint);
- {
- Writes 'Count' longints from 'Buf' to Port
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%esi
- movl port,%edx
- cld
- rep
- outsl
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rsi
- movl port,%edx
- cld
- rep
- outsl
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortW (Port : Longint; Var Buf; Count: longint);
- {
- Writes 'Count' words from 'Buf' to Port
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%esi
- movl port,%edx
- cld
- rep
- outsw
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rsi
- movl port,%edx
- cld
- rep
- outsw
- {$endif CPUX86_64}
- end;
- end;
- Procedure WritePortB (Port : Longint; Var Buf; Count: longint);
- {
- Writes 'Count' bytes from 'Buf' to Port
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%esi
- movl port,%edx
- cld
- rep
- outsb
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rsi
- movl port,%edx
- cld
- rep
- outsb
- {$endif CPUX86_64}
- end;
- end;
- Procedure ReadPort (Port : Longint; Var Value : Byte);
- {
- Reads 'Value' from port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- inb %dx,%al
- movl value,%edx
- movb %al,(%edx)
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- inb %dx,%al
- movq value,%rdx
- movb %al,(%rdx)
- {$endif CPUX86_64}
- end;
- end;
- Procedure ReadPort (Port : Longint; Var Value : Word);
- {
- Reads 'Value' from port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- inw %dx,%ax
- movl value,%edx
- movw %ax,(%edx)
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- inw %dx,%ax
- movq value,%rdx
- movw %ax,(%rdx)
- {$endif CPUX86_64}
- end;
- end;
- Procedure ReadPort (Port : Longint; Var Value : Longint);
- {
- Reads 'Value' from port 'Port'
- }
- begin
- asm
- {$ifdef CPU386}
- movl port,%edx
- inl %dx,%eax
- movl value,%edx
- movl %eax,(%edx)
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- inl %dx,%eax
- movq value,%rdx
- movl %eax,(%rdx)
- {$endif CPUX86_64}
- end;
- end;
- function ReadPortB (Port : Longint): Byte; assembler;
- {
- Reads a byte from port 'Port'
- }
- asm
- {$ifdef CPU386}
- movl port,%edx
- xorl %eax,%eax
- inb %dx,%al
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- xorl %eax,%eax
- inb %dx,%al
- {$endif CPUX86_64}
- end;
- function ReadPortW (Port : Longint): Word; assembler;
- {
- Reads a word from port 'Port'
- }
- asm
- {$ifdef CPU386}
- movl port,%edx
- xorl %eax,%eax
- inw %dx,%ax
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- xorl %eax,%eax
- inw %dx,%ax
- {$endif CPUX86_64}
- end;
- function ReadPortL (Port : Longint): LongInt; assembler;
- {
- Reads a LongInt from port 'Port'
- }
- asm
- {$ifdef CPU386}
- movl port,%edx
- inl %dx,%eax
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl port,%edx
- inl %dx,%eax
- {$endif CPUX86_64}
- end;
- Procedure ReadPortL (Port : Longint; Var Buf; Count: longint);
- {
- Reads 'Count' longints from port 'Port' to 'Buf'.
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%edi
- movl port,%edx
- cld
- rep
- insl
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rdi
- movl port,%edx
- cld
- rep
- insl
- {$endif CPUX86_64}
- end;
- end;
- Procedure ReadPortW (Port : Longint; Var Buf; Count: longint);
- {
- Reads 'Count' words from port 'Port' to 'Buf'.
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%edi
- movl port,%edx
- cld
- rep
- insw
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rdi
- movl port,%edx
- cld
- rep
- insw
- {$endif CPUX86_64}
- end;
- end;
- Procedure ReadPortB (Port : Longint; Var Buf; Count: longint);
- {
- Reads 'Count' bytes from port 'Port' to 'Buf'.
- }
- begin
- asm
- {$ifdef CPU386}
- movl count,%ecx
- movl buf,%edi
- movl port,%edx
- cld
- rep
- insb
- {$endif CPU386}
- {$ifdef CPUX86_64}
- movl count,%ecx
- movq buf,%rdi
- movl port,%edx
- cld
- rep
- insb
- {$endif CPUX86_64}
- end;
- end;
- {$if defined(linux) or defined(android)}
- Function fpIOperm (From,Num : Cardinal; Value : cint) : cint;
- {
- Set permissions on NUM ports starting with port FROM to VALUE
- this works ONLY as root.
- }
- begin
- fpIOPerm:=do_Syscall(Syscall_nr_ioperm,TSysParam(From),TSysParam(Num),TSysParam(Value));
- end;
- {$else}
- {$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;
- }
- i386_ioperm_args = record
- start : cuint;
- length : cuint;
- enable : cint;
- end;
- i386_vm86_args = record
- sub_op : cint; { sub-operation to perform }
- sub_args : pchar; { args }
- end;
- sysarch_args = record
- op : longint;
- parms : pchar;
- end;
- Function fpIOPerm(From,Num:CARDINAL;Value:cint):cint;
- 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;
- fpIOPerm:=do_syscall(syscall_nr_sysarch,TSysParam(@sa));
- end;
- {$endif}
- Function fpIoPL(Level : cint) : cint;
- begin
- {$ifdef Linux}
- fpIOPL:=do_Syscall(Syscall_nr_iopl,TSysParam(Level));
- {$else}
- fpIOPL:=-1;
- FpSetErrNo(ESysENoSys);
- {$endif}
- end;
- end.
|