[fpc-pascal] syscalls and fpc
Vincent Snijders
vsnijders at quicknet.nl
Sat Feb 16 12:47:27 CET 2008
ik schreef:
> OK, so why don't you just say that you do not understand ?!
You don't understand.
>
> Let me start again. I never said that you, Micha, Daniel, Peter,
> Florian, or even the big bad wolf should implement all of the given
> syscall functions in the each platform in the world.
>
> The design of Do_SysCall at this time is hurting the usage of
> syscalls, for 3 reasons:
>
> 1. There is a support only for up to 6 parameters (plus the instruction itself).
Yes, and for i386 that is the limit, dictated by the hardware.
> 2. It support only integer base parameters, while you can not pass
> pointers, chars, array, record or floating point types.
Syscall pass registers, which are integers, so I don't see the problem.
> 3. Each OS changes/add/remove functions frequently, so assuming one of
> the above making the functions unusable for anything that is not an
> integer and up to 6 parameters.
Which syscall has more than 6 parameter or a parameter that does not fit
in a register?
>
> (If you do not understand my points please ask, and I'll try to clear it up)
See above, I think I don't understand.
>
> Now one *example* (that caused me to notice this issues) is the following:
>
> extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask)
Is this a syscal with 3 parameters that fit in a register?
>
> So as you can see by the Do_SysCall function(s):
>
> function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult;
> external name 'FPC_SYSCALL6';
>
> They unable to give you an answer to the above deceleration.
> So my questions are (still):
>
> 1. Is there a way to implement the above with array of const ?
Why? Not needed.
> 2. Is there a way to implement the above without using assembly, and
> if you must use assembly, then is there a way to use array of const
> inside the assembly, and if so, how ?
Why? Not needed.
>
> As you can see, I still haven't requested anyone to do it for me, I'm
> only trying to figure out how to achieve the above request with
> syscall using FPC !
>
> Here is a small way to do it btw, but it will be problematic with
> records (if you use assembly):
>
> function Do_SysCall(sysnr : TSysParam; const
> param1,param2,param3,param4,param5,param6) : TSysResult; external
> name 'FPC_SYSCALL6';
>
> The problem is of course the number of bits that the registers can
> store in them (32 bit in i386 and 64 bit on x86_64).
> So when Micha mentioned the registers, I asked if my knowledge is
> valid, that you can do the following:
>
> push param1
> push param2
> push param3
> ...
> push param6
No, you cant't because the kernel expects the parameters in the
registers and put them on the stack.
The rest *I* did not understand, so I snipped it.
For your example, I expect you to write a wrapper like (taken one at
random):
function fpugetrlimit(resource : cInt; rlim : PRLimit) : cInt;
begin
FpUGetRLimit := do_syscall(syscall_nr_ugetrlimit,
TSysParam(resource), TSysParam(rlim));
end;
Something like:
function fpinotify_add_watch (__fd: cint; __name: pchar; __mask:
cuint32) : cint;
begin
fpinotify_add_watch := do_syscall(syscall_nr_inotify_add_watch,
TSysParam(__fd), TSysParam(__name), TSysParam(__mask));
end;
Vincent
More information about the fpc-pascal
mailing list