Thu Jan 20 01:14:27 2011: Request 55660 was acted upon.
Transaction: Correspondence added by jain_vipin_swm
Queue: Win32-API
Subject: [PATCH] Partial win64 support for Win32::API
Broken in: (no value)
Severity: (no value)
Owner: COSIMO
Requestors: [email protected], [email protected]
Status: open
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=55660 >
On Wed Mar 17 10:09:53 2010, [email protected] wrote:
> The attached three patches (against Win32-API-0.59) implement initial
> support for 64-bit Windows in Win32-API.
>
> I didn't attempt to
> port Win32::API::Callback. It looks like considerably more effort
> than Win32::API itself, and as our application doesn't need it I
> couldn't justify the paid time to spend on it. This is, however,
> sufficient for Win32::API tests to pass against a 64-bit ActivePerl
> 5.8.9.
>
> At present, only MSVC++ toolchains will work, as its
> assembly dialect is different from GNU. I don't have a gcc-based
> build of Perl to work with to port it, but it should only require a
> straightforward translation of call_asm_x64_msvc.asm into
> call_asm_x64_gnu.asm.
>
> The required changes to Makefile.PL are
> also somewhat hackish, purely because I don't know of a better way
> to detect what architecture we're targeting.
>
> Accelrys Limited
> (http://accelrys.com)
> Registered office: 334 Cambridge Science
> Park, Cambridge, CB4 0WN, UK
> Registered in England: 2326316
It seems that call_x64_real assembly function has a bug. It causes a
perl crash if we call a Windows API needing more than 4 parameters.
Ex.
Win32::DriveInfo::GetFreeDiskSpace,Win32::DriveInfo::GetFreeDiskSpaceEx.
These APIs expect more than 4 parameter, so some of the parameters
(nstack = nparams - available_registers) are copied from copystack
block of assembly code. This code has a bug which I fixed. I attached a
patch for this.
Basically, we were subtracting before testing for zero, this resulted
into non-zero value when rax = 0 and instruction "sub rax 1" executed.
-Vipin
diff --git a/call_asm_x64_msvc.asm b/call_asm_x64_msvc.asm
index 7f8b2b0..43e8941 100755
--- a/call_asm_x64_msvc.asm
+++ b/call_asm_x64_msvc.asm
@@ -38,12 +38,11 @@ Call_x64_real PROC FRAME
; Except not if there isn't any
test rax, rax
jz docall
- sub rax, 1
copystack:
+ sub rax, 1
mov r10, qword ptr [rsi+8*rax]
push r10
- sub rax, 1
test rax, rax
jnz copystack