From: Pascal J.B. <pj...@in...> - 2004-12-11 23:32:11
|
It seems that 64-bit FFI doesn't work. I've got a simple peek-and-poke library: unsigned char peek8 (unsigned char* address){return(*address);} unsigned short peek16(unsigned short* address){return(*address);} unsigned long peek32(unsigned long* address){return(*address);} unsigned long long peek64(unsigned long long* address){return(*address);} void poke8(unsigned char* address,unsigned char value){(*address)=value;} void poke16(unsigned short* address,unsigned short value){(*address)=value;} void poke32(unsigned long* address,unsigned long value){(*address)=value;} void poke64(unsigned long long* address, unsigned long long value){(*address)=value;} The code generated is ok, the C compiler push and fetches the 64-bit arguments on the stack, but it doesn't work with these FFI declarations: (defmacro generate-peek-and-poke () (loop with code = '() for size in '(8 16 32 64) ;; peek and poke of 64-bit don't work. for c-peek-name = (format nil "peek~D" size) for c-poke-name = (format nil "poke~D" size) do (loop for type in '(uint sint) for l-peek-name = (intern (with-standard-io-syntax (format nil"PEEK-~A~D" type size)) "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") for l-poke-name = (intern (with-standard-io-syntax (format nil"POKE-~A~D" type size)) "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") for l-type = (intern (with-standard-io-syntax (format nil"~A~D" type size)) "FFI") do (push `(ffi:def-call-out ,l-peek-name (:name ,c-peek-name) (:arguments (address ffi:ulong)) (:return-type ,l-type) (:library #.+library+) (:language :stdc)) code) (push `(ffi:def-call-out ,l-poke-name (:name ,c-poke-name) (:arguments (address ffi:ulong) (value ,l-type)) (:return-type nil) (:library #.+library+) (:language :stdc)) code)) finally (return `(progn ,@ code)))) (eval-when (:load-toplevel :execute) (generate-peek-and-poke)) This is not urgent since I use this work around: (defun peek-uint64 (address) (dpb (raw-memory:peek-uint32 (+ 4 address)) (byte 32 32) (raw-memory:peek-uint32 address))) (defun peek-sint64 (address) (dpb (raw-memory:peek-uint32 (+ 4 address)) (byte 32 32) (raw-memory:peek-uint32 address))) (defun poke-uint64 (address object) (raw-memory:poke-uint32 address (ldb (byte 32 0) object)) (raw-memory:poke-uint32 (+ 4 address) (ldb (byte 32 32) object))) (defun poke-sint64 (address object) (raw-memory:poke-uint32 address (ldb (byte 32 0) object)) (raw-memory:poke-uint32 (+ 4 address) (ldb (byte 32 32) object))) -- __Pascal Bourguignon__ http://www.informatimago.com/ The world will now reboot; don't bother saving your artefacts. |
From: LiteStar <sa...@sd...> - 2004-12-12 02:59:44
|
Which arch is this built for? CLISP would not build correctly on UltraSPARCII and acted funky on Alpha (both running NetBSD). On Sun, 12 Dec 2004, Pascal J.Bourguignon wrote: > Date: Sun, 12 Dec 2004 00:31:52 +0100 (CET) > From: Pascal J.Bourguignon <pj...@in...> > To: cli...@li... > Subject: [clisp-list] 64-bit FFI > > > It seems that 64-bit FFI doesn't work. > > I've got a simple peek-and-poke library: > > > unsigned char peek8 (unsigned char* address){return(*address);} > unsigned short peek16(unsigned short* address){return(*address);} > unsigned long peek32(unsigned long* address){return(*address);} > unsigned long long peek64(unsigned long long* address){return(*address);} > void poke8(unsigned char* address,unsigned char value){(*address)=value;} > void poke16(unsigned short* address,unsigned short value){(*address)=value;} > void poke32(unsigned long* address,unsigned long value){(*address)=value;} > void poke64(unsigned long long* address, > unsigned long long value){(*address)=value;} > > The code generated is ok, the C compiler push and fetches the 64-bit > arguments on the stack, but it doesn't work with these FFI declarations: > > > (defmacro generate-peek-and-poke () > (loop with code = '() > for size in '(8 16 32 64) ;; peek and poke of 64-bit don't work. > for c-peek-name = (format nil "peek~D" size) > for c-poke-name = (format nil "poke~D" size) do > (loop for type in '(uint sint) > for l-peek-name = (intern (with-standard-io-syntax > (format nil"PEEK-~A~D" type size)) > "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") > for l-poke-name = (intern (with-standard-io-syntax > (format nil"POKE-~A~D" type size)) > "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") > for l-type = (intern (with-standard-io-syntax > (format nil"~A~D" type size)) > "FFI") > do > (push `(ffi:def-call-out ,l-peek-name > (:name ,c-peek-name) > (:arguments (address ffi:ulong)) > (:return-type ,l-type) > (:library #.+library+) (:language :stdc)) code) > (push `(ffi:def-call-out ,l-poke-name > (:name ,c-poke-name) > (:arguments (address ffi:ulong) (value ,l-type)) > (:return-type nil) > (:library #.+library+) (:language :stdc)) code)) > finally (return `(progn ,@ code)))) > > > > (eval-when (:load-toplevel :execute) > (generate-peek-and-poke)) > > > > This is not urgent since I use this work around: > > (defun peek-uint64 (address) > (dpb (raw-memory:peek-uint32 (+ 4 address)) > (byte 32 32) > (raw-memory:peek-uint32 address))) > > (defun peek-sint64 (address) > (dpb (raw-memory:peek-uint32 (+ 4 address)) > (byte 32 32) > (raw-memory:peek-uint32 address))) > > (defun poke-uint64 (address object) > (raw-memory:poke-uint32 address (ldb (byte 32 0) object)) > (raw-memory:poke-uint32 (+ 4 address) (ldb (byte 32 32) object))) > > (defun poke-sint64 (address object) > (raw-memory:poke-uint32 address (ldb (byte 32 0) object)) > (raw-memory:poke-uint32 (+ 4 address) (ldb (byte 32 32) object))) > > -- > __Pascal Bourguignon__ http://www.informatimago.com/ > The world will now reboot; don't bother saving your artefacts. > > > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real users. > Discover which products truly live up to the hype. Start reading now. > http://productguide.itmanagersjournal.com/ > _______________________________________________ > clisp-list mailing list > cli...@li... > https://lists.sourceforge.net/lists/listinfo/clisp-list > ------------------------------------------------------- << God is a commedian playing to an audiance too afraid to laugh >> -- Voltair << Are you one who looks on? Or one who lends a hand? Or one who looks away and walks off? Third Question of conscience. >> -- Nietzsche webspace: Super DImensional Fortress - http://sae.freeshell.org Dowling Computer Club - http://alien.dowling.edu/~litestar/ sa...@sd... SDF Public Access UNIX System - http://sdf.lonestar.org Dowling College Computer Club - http://alien.dowling.edu |
From: Pascal J.B. <pj...@in...> - 2004-12-12 03:35:17
|
LiteStar writes: > Which arch is this built for? CLISP would not build correctly on > UltraSPARCII and acted funky on Alpha (both running NetBSD). > On Sun, 12 Dec 2004, Pascal J.Bourguignon wrote: On a 32-bit Athlon. CL-USER> (lisp-implementation-type) "CLISP" CL-USER> (lisp-implementation-version) "2.33.2 (2004-06-02) (built 3301657794) (memory 3301658327)" CL-USER> (machine-type) "I686" CL-USER> (machine-version) "I686" CL-USER> (software-type) "ANSI C program" CL-USER> (software-version) "GNU C 3.3 20030226 (prerelease) (SuSE Linux)" CL-USER> > > Date: Sun, 12 Dec 2004 00:31:52 +0100 (CET) > > From: Pascal J.Bourguignon <pj...@in...> > > To: cli...@li... > > Subject: [clisp-list] 64-bit FFI > > > > > > It seems that 64-bit FFI doesn't work. > > > > I've got a simple peek-and-poke library: > > > > > > unsigned char peek8 (unsigned char* address){return(*address);} > > unsigned short peek16(unsigned short* address){return(*address);} > > unsigned long peek32(unsigned long* address){return(*address);} > > unsigned long long peek64(unsigned long long* address){return(*address);} > > void poke8(unsigned char* address,unsigned char value){(*address)=value;} > > void poke16(unsigned short* address,unsigned short value){(*address)=value;} > > void poke32(unsigned long* address,unsigned long value){(*address)=value;} > > void poke64(unsigned long long* address, > > unsigned long long value){(*address)=value;} > > > > The code generated is ok, the C compiler push and fetches the 64-bit > > arguments on the stack, but it doesn't work with these FFI declarations: > > > > > > (defmacro generate-peek-and-poke () > > (loop with code = '() > > for size in '(8 16 32 64) ;; peek and poke of 64-bit don't work. > > for c-peek-name = (format nil "peek~D" size) > > for c-poke-name = (format nil "poke~D" size) do > > (loop for type in '(uint sint) > > for l-peek-name = (intern (with-standard-io-syntax > > (format nil"PEEK-~A~D" type size)) > > "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") > > for l-poke-name = (intern (with-standard-io-syntax > > (format nil"POKE-~A~D" type size)) > > "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") > > for l-type = (intern (with-standard-io-syntax > > (format nil"~A~D" type size)) > > "FFI") > > do > > (push `(ffi:def-call-out ,l-peek-name > > (:name ,c-peek-name) > > (:arguments (address ffi:ulong)) > > (:return-type ,l-type) > > (:library #.+library+) (:language :stdc)) code) > > (push `(ffi:def-call-out ,l-poke-name > > (:name ,c-poke-name) > > (:arguments (address ffi:ulong) (value ,l-type)) > > (:return-type nil) > > (:library #.+library+) (:language :stdc)) code)) > > finally (return `(progn ,@ code)))) > > > > > > > > (eval-when (:load-toplevel :execute) > > (generate-peek-and-poke)) -- __Pascal Bourguignon__ http://www.informatimago.com/ The world will now reboot; don't bother saving your artefacts. |
From: LiteStar <sa...@sd...> - 2004-12-12 21:47:01
|
Ahh, in my tired state I misread this. Sorry. On Sun, 12 Dec 2004, Pascal J.Bourguignon wrote: > Date: Sun, 12 Dec 2004 04:35:04 +0100 > From: Pascal J.Bourguignon <pj...@in...> > To: LiteStar <sa...@sd...> > Cc: Pascal J.Bourguignon <pj...@in...>, > cli...@li... > Subject: Re: [clisp-list] 64-bit FFI > > > LiteStar writes: >> Which arch is this built for? CLISP would not build correctly on >> UltraSPARCII and acted funky on Alpha (both running NetBSD). >> On Sun, 12 Dec 2004, Pascal J.Bourguignon wrote: > > On a 32-bit Athlon. > > CL-USER> (lisp-implementation-type) > "CLISP" > CL-USER> (lisp-implementation-version) > "2.33.2 (2004-06-02) (built 3301657794) (memory 3301658327)" > CL-USER> (machine-type) > "I686" > CL-USER> (machine-version) > "I686" > CL-USER> (software-type) > "ANSI C program" > CL-USER> (software-version) > "GNU C 3.3 20030226 (prerelease) (SuSE Linux)" > CL-USER> > >>> Date: Sun, 12 Dec 2004 00:31:52 +0100 (CET) >>> From: Pascal J.Bourguignon <pj...@in...> >>> To: cli...@li... >>> Subject: [clisp-list] 64-bit FFI >>> >>> >>> It seems that 64-bit FFI doesn't work. >>> >>> I've got a simple peek-and-poke library: >>> >>> >>> unsigned char peek8 (unsigned char* address){return(*address);} >>> unsigned short peek16(unsigned short* address){return(*address);} >>> unsigned long peek32(unsigned long* address){return(*address);} >>> unsigned long long peek64(unsigned long long* address){return(*address);} >>> void poke8(unsigned char* address,unsigned char value){(*address)=value;} >>> void poke16(unsigned short* address,unsigned short value){(*address)=value;} >>> void poke32(unsigned long* address,unsigned long value){(*address)=value;} >>> void poke64(unsigned long long* address, >>> unsigned long long value){(*address)=value;} >>> >>> The code generated is ok, the C compiler push and fetches the 64-bit >>> arguments on the stack, but it doesn't work with these FFI declarations: >>> >>> >>> (defmacro generate-peek-and-poke () >>> (loop with code = '() >>> for size in '(8 16 32 64) ;; peek and poke of 64-bit don't work. >>> for c-peek-name = (format nil "peek~D" size) >>> for c-poke-name = (format nil "poke~D" size) do >>> (loop for type in '(uint sint) >>> for l-peek-name = (intern (with-standard-io-syntax >>> (format nil"PEEK-~A~D" type size)) >>> "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") >>> for l-poke-name = (intern (with-standard-io-syntax >>> (format nil"POKE-~A~D" type size)) >>> "COM.INFORMATIMAGO.CLISP.RAW-MEMORY") >>> for l-type = (intern (with-standard-io-syntax >>> (format nil"~A~D" type size)) >>> "FFI") >>> do >>> (push `(ffi:def-call-out ,l-peek-name >>> (:name ,c-peek-name) >>> (:arguments (address ffi:ulong)) >>> (:return-type ,l-type) >>> (:library #.+library+) (:language :stdc)) code) >>> (push `(ffi:def-call-out ,l-poke-name >>> (:name ,c-poke-name) >>> (:arguments (address ffi:ulong) (value ,l-type)) >>> (:return-type nil) >>> (:library #.+library+) (:language :stdc)) code)) >>> finally (return `(progn ,@ code)))) >>> >>> >>> >>> (eval-when (:load-toplevel :execute) >>> (generate-peek-and-poke)) > > -- > __Pascal Bourguignon__ http://www.informatimago.com/ > The world will now reboot; don't bother saving your artefacts. > > ------------------------------------------------------- << God is a commedian playing to an audiance too afraid to laugh >> -- Voltair << Are you one who looks on? Or one who lends a hand? Or one who looks away and walks off? Third Question of conscience. >> -- Nietzsche webspace: Super DImensional Fortress - http://sae.freeshell.org Dowling Computer Club - http://alien.dowling.edu/~litestar/ sa...@sd... SDF Public Access UNIX System - http://sdf.lonestar.org Dowling College Computer Club - http://alien.dowling.edu |