Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2020-11

fpmmap problem 64 bit linux

4 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Rainer Stratmann

A 32 bit freepascal program on a 32 bit Linux Debian system is working properly. It uses fpmmap for getting the adress of a kms framebuffer.

The same 32 bit program on a 64 bit Linux Debian system *** is not working. When it comes to the fpmmap it gives an error:

Sys_EINVAL
One of the record fields Start, length or offset is invalid.

https://www.freepascal.org/docs-html/rtl/baseunix/fpmmap.html

I figured out that it likely can only be the offset value since start and length are always the same.

The offset value I got from a previous DRM function.

On the 32 bit System this offset value is $10000000 (fits in 32 bit) And on the 64 bit System this offset value is $100000000 (does not fit in 32 bit).

Can it be possible that the fpmmap function strips the offset value to 32 bit? Is there another way to call fpmmap more directly? What does fpmmap exactly?
Where can I research?

***
dpkg --add-architecture i386
apt-get update
apt-get install libc6-i386

Alexander Grotewohl
to Rainer Stratmann

It would seem C handles this at compile time with a define.. mapping mmap to mmap64. Which would almost seem to imply you'd end up with a 32 bit binary that would only work on 64 bit systems. I'm not really sure how this would work for Pascal. You could start by looking in the file listed in the fpmmap docs you posted. My guess is the easiest answer is "distribute both 32 and 64 bit versions," but that doesn't help when you need to test the 32 bit one..

Alexander Grotewohl https://dcclost.com -- Alexander Grotewohl https://dcclost.com ________________________________
Earlier message 38 lines
From: fpc-pascal on behalf of Rainer Stratmann via fpc-pascal Sent: Friday, November 20, 2020 6:33:51 PM To: Cc: Rainer Stratmann Subject: [fpc-pascal] fpmmap problem 64 bit linux A 32 bit freepascal program on a 32 bit Linux Debian system is working properly. It uses fpmmap for getting the adress of a kms framebuffer. The same 32 bit program on a 64 bit Linux Debian system *** is not working. When it comes to the fpmmap it gives an error: Sys_EINVAL One of the record fields Start, length or offset is invalid. https://www.freepascal.org/docs-html/rtl/baseunix/fpmmap.html I figured out that it likely can only be the offset value since start and length are always the same. The offset value I got from a previous DRM function. On the 32 bit System this offset value is $10000000 (fits in 32 bit) And on the 64 bit System this offset value is $100000000 (does not fit in 32 bit). Can it be possible that the fpmmap function strips the offset value to 32 bit? Is there another way to call fpmmap more directly? What does fpmmap exactly? Where can I research? *** dpkg --add-architecture i386 apt-get update apt-get install libc6-i386
Rainer Stratmann
to Alexander Grotewohl

I watched the syscalls with strace and my assumption was confirmed.

function Fpmmap( start: pointer; len: size_t; prot: cint; flags: cint; fd:cint;
offst: off_t ):pointer;

My offst value for fpmmap is $100000000.

strace output:

mmap(NULL, 1920000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_32BIT, 3, 0) = -1 EINVAL

Here the value is 0.

It is likely that the offst value is stripped to 32 bit before passed to the mmap syscall.

Am Samstag, 21. November 2020, 01:15:20 CET schrieb Alexander Grotewohl via fpc-pascal:

Show quoted text 58 lines
It would seem C handles this at compile time with a define.. mapping mmap to mmap64. Which would almost seem to imply you'd end up with a 32 bit binary that would only work on 64 bit systems. I'm not really sure how this would work for Pascal. You could start by looking in the file listed in the fpmmap docs you posted. My guess is the easiest answer is "distribute both 32 and 64 bit versions," but that doesn't help when you need to test the 32 bit one.. -- Alexander Grotewohl https://dcclost.com -- Alexander Grotewohl https://dcclost.com ________________________________ From: fpc-pascal on behalf of Rainer Stratmann via fpc-pascal Sent: Friday, November 20, 2020 6:33:51 PM To: Cc: Rainer Stratmann Subject: [fpc-pascal] fpmmap problem 64 bit linux A 32 bit freepascal program on a 32 bit Linux Debian system is working properly. It uses fpmmap for getting the adress of a kms framebuffer. The same 32 bit program on a 64 bit Linux Debian system *** is not working. When it comes to the fpmmap it gives an error: Sys_EINVAL One of the record fields Start, length or offset is invalid. https://www.freepascal.org/docs-html/rtl/baseunix/fpmmap.html I figured out that it likely can only be the offset value since start and length are always the same. The offset value I got from a previous DRM function. On the 32 bit System this offset value is $10000000 (fits in 32 bit) And on the 64 bit System this offset value is $100000000 (does not fit in 32 bit). Can it be possible that the fpmmap function strips the offset value to 32 bit? Is there another way to call fpmmap more directly? What does fpmmap exactly? Where can I research? *** dpkg --add-architecture i386 apt-get update apt-get install libc6-i386 _______________________________________________ fpc-pascal maillist - https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Rainer Stratmann
to Rainer Stratmann

mmap2 could be helpful.

The mmap2() system call provides the same interface as mmap(), except that the final argument specifies the offset into the file in 4096-byte units (instead of bytes, as is done by mmap()). This enables applications that use a 32-bit off_t to map large files (up to 2^44 bytes).

https://man7.org/linux/man-pages/man2/mmap2.2.html

But it is not yet implemented.

FPC 3.0.4

Am Samstag, 21. November 2020, 13:31:22 CET schrieb Rainer Stratmann via fpc- pascal:

Show quoted text 86 lines
I watched the syscalls with strace and my assumption was confirmed. function Fpmmap( start: pointer; len: size_t; prot: cint; flags: cint; fd:cint; offst: off_t ):pointer; My offst value for fpmmap is $100000000. strace output: mmap(NULL, 1920000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_32BIT, 3, 0) = -1 EINVAL Here the value is 0. It is likely that the offst value is stripped to 32 bit before passed to the mmap syscall. Am Samstag, 21. November 2020, 01:15:20 CET schrieb Alexander Grotewohl via fpc-pascal: > It would seem C handles this at compile time with a define.. mapping mmap > to mmap64. Which would almost seem to imply you'd end up with a 32 bit > binary that would only work on 64 bit systems. I'm not really sure how > this would work for Pascal. You could start by looking in the file listed > in the fpmmap docs you posted. My guess is the easiest answer is > "distribute both 32 and 64 bit versions," but that doesn't help when you > need to test the 32 bit one.. > > -- > Alexander Grotewohl > https://dcclost.com > > -- > Alexander Grotewohl > https://dcclost.com > ________________________________ > From: fpc-pascal on behalf of > Rainer Stratmann via fpc-pascal Sent: > Friday, November 20, 2020 6:33:51 PM > To: > Cc: Rainer Stratmann > Subject: [fpc-pascal] fpmmap problem 64 bit linux > > A 32 bit freepascal program on a 32 bit Linux Debian system is working > properly. It uses fpmmap for getting the adress of a kms framebuffer. > > The same 32 bit program on a 64 bit Linux Debian system *** is not > working. > When it comes to the fpmmap it gives an error: > > Sys_EINVAL > > One of the record fields Start, length or offset is invalid. > > https://www.freepascal.org/docs-html/rtl/baseunix/fpmmap.html > > I figured out that it likely can only be the offset value since start and > length are always the same. > > The offset value I got from a previous DRM function. > > On the 32 bit System this offset value is $10000000 (fits in 32 bit) > And on the 64 bit System this offset value is $100000000 (does not fit in > 32 bit). > > Can it be possible that the fpmmap function strips the offset value to 32 > bit? Is there another way to call fpmmap more directly? > What does fpmmap exactly? > Where can I research? > > > *** > dpkg --add-architecture i386 > apt-get update > apt-get install libc6-i386 > > > _______________________________________________ > fpc-pascal maillist - > https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist - https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal