Sat Dec 31 14:49:10 2022: Request 145723 was acted upon.
Transaction: Correspondence added by BULKDD
Queue: Win32-API
Subject: Add support for Windows on ARM64
Broken in: (no value)
Severity: (no value)
Owner: Nobody
Requestors: [email protected]
Status: new
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=145723 >
On Thu Dec 29 12:10:45 2022, [email protected] wrote:
> I'm trying to compile Win32-API from Git (
> https://github.com/bulk88/perl5-win32-api) for ARM64, but this
> platform
> isn't supported by the code yet.
>
> I was able to port Win32::API::Call over to ARM64 via
> https://github.com/stephenjust/perl5-win32-
> api/commit/44267e3bca3627979d9625366494e2423c05f286
> but I don't really understand Win32::API::Callback and would
> appreciate
> some help with that part.
>
> Regards,
> Stephen
Win32::API::Callback, makes 1-off executable binary machine code, C function
pointers "on-demand/runtime", AKA as JIT, those C function pointers call back
into Perl. No "void *" or "opaque *" needs to be passed through Alien 3rd party
C lib, to get back to Perl VM with the correct context, the Perl context info
is stored in an int/pointer const in the one-off binary C function. Remember
generic "malloc" often isn't enough because of x86 DEP, etc. You probably need
memory page protection changing like I did here.
I would need a document/blog article on describing what Win-on-ARM ABI is.
https://github.com/stephenjust/perl5-win32-api/blob/master/Callback.pm#L285
This needs to be adjusted with an ARM template, basically copy pasted ARM
assembly code from the template, then fill in the pointer consts, tailcall/jmp
(remove the hand-written 1 off C function binary from C stack) to "stage 2"
Stage2CallbackX64/PerlCallback, which is Plain C code. I would follow the
"Stage2CallbackX64" implementation, because its simpler, and for 32-bit x86,
"Stage2CallbackX64"'s functionality was directly embedded into the "C machine
code in a string" factory in Callback.pm. Keeping those "machine code in a
string" 1 off templates shorter is probably for the better, for maint reasons.
https://github.com/stephenjust/perl5-win32-api/blob/master/Callback/Callback.xs#L102