FPPS4/sys/sys_machdep.pas

161 lines
2.9 KiB
Plaintext

unit sys_machdep;
{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}
interface
const
I386_GET_IOPERM = 3;
I386_SET_IOPERM = 4;
I386_GET_FSBASE = 7;
I386_SET_FSBASE = 8;
I386_GET_GSBASE = 9;
I386_SET_GSBASE = 10;
AMD64_GET_FSBASE =128;
AMD64_SET_FSBASE =129;
AMD64_GET_GSBASE =130;
AMD64_SET_GSBASE =131;
type
p_i386_ioperm_args=^t_i386_ioperm_args;
t_i386_ioperm_args=packed record
start :DWORD;
length:DWORD;
enable:Integer;
end;
function sys_sysarch(op:Integer;parms:Pointer):Integer;
implementation
uses
errno,
systm,
vmparam,
kern_thread;
function amd64_get_ioperm(uap:p_i386_ioperm_args):Integer;
begin
if (uap^.start >= (IOPAGES * PAGE_SIZE * NBBY)) then
Exit(EINVAL);
uap^.length:=0;
Exit(0);
end;
function amd64_set_ioperm(uap:p_i386_ioperm_args):Integer;
begin
Exit(EPERM); //priv_check(td, PRIV_IO)
end;
function sys_sysarch(op:Integer;parms:Pointer):Integer;
var
i386base:DWORD;
a64base :QWORD;
iargs :t_i386_ioperm_args;
begin
Result:=0;
i386base:=0;
a64base :=0;
//read
case op of
I386_GET_IOPERM,
I386_SET_IOPERM:
begin
Result:=copyin(parms, @iargs, sizeof(t_i386_ioperm_args));
end;
I386_SET_FSBASE,
I386_SET_GSBASE:
begin
Result:=copyin(parms, @i386base, sizeof(i386base));
end;
AMD64_SET_FSBASE,
AMD64_SET_GSBASE:
begin
Result:=copyin(parms, @a64base, sizeof(a64base));
end;
else;
end;
if (Result<>0) then Exit;
//operation
case op of
I386_GET_IOPERM:
begin
Result:=amd64_get_ioperm(@iargs);
end;
I386_SET_IOPERM:
begin
Result:=amd64_set_ioperm(@iargs);
end;
I386_GET_FSBASE:
begin
Result:=sys_amd64_get_fsbase(@a64base);
i386base:=a64base;
end;
I386_SET_FSBASE:
begin
a64base:=i386base;
Result:=sys_amd64_set_fsbase(Pointer(a64base));
end;
I386_GET_GSBASE:
begin
Result:=sys_amd64_get_gsbase(@a64base);
i386base:=a64base;
end;
I386_SET_GSBASE:
begin
a64base:=i386base;
Result:=sys_amd64_set_gsbase(Pointer(a64base));
end;
AMD64_GET_FSBASE:
begin
Result:=sys_amd64_get_fsbase(@a64base);
end;
AMD64_SET_FSBASE:
begin
Result:=sys_amd64_set_fsbase(Pointer(a64base));
Writeln('set_fsbase=0x',HexStr(a64base,16));
end;
AMD64_GET_GSBASE:
begin
Result:=sys_amd64_get_gsbase(@a64base);
end;
AMD64_SET_GSBASE:
begin
Result:=sys_amd64_set_gsbase(Pointer(a64base));
end;
else
Exit(EINVAL);
end;
if (Result<>0) then Exit;
//write
case op of
I386_GET_IOPERM:
begin
Result:=copyout(@iargs, parms, sizeof(t_i386_ioperm_args));
end;
I386_GET_FSBASE,
I386_GET_GSBASE:
begin
Result:=copyout(@i386base, parms, sizeof(i386base));
end;
AMD64_GET_FSBASE,
AMD64_GET_GSBASE:
begin
Result:=copyout(@a64base, parms, sizeof(a64base));
end;
else;
end;
end;
end.