Re: x64 Calling convetion(ABI) issues.
- From: "Ivan Brugiolo [MSFT]" <ivanbrug@xxxxxxxxxxxxxxxxxxxx>
- Date: Mon, 15 Aug 2005 16:34:07 -0700
I'm piggy-backing to this thread one more general consideration:
despite the similarity between x86 and AMD64 as assembly syntax,
one thing that people often do not fully understand is the exception unwind
model
of AMD64, that is radically different, and that requires the
compiler/assembler
to properly describe the code regions, and the register usage in each code
region.
Writing anything that is not a leaf function in assembly is simply a
self-suicide task.
If may seem right per code inspection and average test usage, but, the first
time the OS will have to unwind throught that code, it may simply
double-fault,
Access Violate in kernel-mode, or have other unpredictable behaviors.
Please refrain from writing non leaf-entry functions in assembly,
that's the average recomendation.
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Use of any included script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm
"Sam" <joe@xxxxxxxxxx> wrote in message
news:Oe7aiFeoFHA.3256@xxxxxxxxxxxxxxxxxxxxxxx
> Thanks for the quick summary -- it is printed out and posted right on my
> wall!!
>
> "Ivan Brugiolo [MSFT]" <ivanbrug@xxxxxxxxxxxxxxxxxxxx> wrote in message
> news:eq4uZdboFHA.2152@xxxxxxxxxxxxxxxxxxxxxxx
>> > So have to rewrite the _asm session to C or intrinsic function.
>>
>> You can use an external *.ASM file that you can place in
>> an architecture specific folder, and then have build.exe to
>> pick-it up from the SOURCES file.
>>
>> You may want to check
>> http://www.microsoft.com/whdc/winhec/partners/64bitAMD.mspx
>>
>> And, as a quick summary
>> Parameter registers are rcx, rdx, r8, and r9. Stack pointer is rsp. The
>> usual x86 preserved registers are the same (rbx, rbp, rsi, rdi), in
> addition
>> to r12-r15. r10 and r11 are additional scratch registers.
>>
>> Unlike x86, methods will allocate all the stack space they need up front,
> so
>> a frame pointer (ebp) is normally not needed, and there are no push's or
>> pop's anywhere else in the method. 'k' does not even have a column for
> rbp.
>>
>> For more than 4 parameters, the values will be at the caller's rsp +
>> 0x20.
>> Unlike x86, the caller always controls space for the parameters - rsp is
>> always the same before and after any call. On x86, the non-register
>> parameters are pushed. On amd64, the space for the extra parameters will
> be
>> allocated at the start of the method, and at the call, they are mov'd
>> into
>> the stack with instructions like 'mov [rsp+0x20], rax'.
>>
>> By convention, parameters are usually saved at the caller's rsp. Ex. you
> can
>> find r8 at the callers rsp (this is where 'kv' gets it from). This is not
>> required though, and the values might not be saved in optimized builds.
>>
>> Structs are passed by reference if > 8 bytes. In other words, if it won't
>> fit in a register, it's passed by reference. Similarly, return values > 8
>> bytes require that the caller allocate a buffer, and the buffer is passed
> in
>> rcx. This means rcx/the first parameter is *not* always the 'this'
> pointer.
>>
>> Can you possibly post the `.fnentry <function_address>` output for
>> the function that do not pass ?
>>
>> --
>> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>> Use of any included script samples are subject to the terms specified at
>> http://www.microsoft.com/info/cpyright.htm
>>
>>
>> "Tonald" <Tonald@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
>> news:4CA9D390-E331-45B1-8755-9B91EC16DF9D@xxxxxxxxxxxxxxxx
>> > _asm{...} is not allowed in 64bit DDK compiler.
>> > So have to rewrite the _asm session to C or intrinsic function.
>> > While, rewrite to C works fine, but rewrite to intrinsic
> funtion(complete
>> > assemble code) have some problems.
>> > In HCT 12.1, there is a x64 calling convention test, which complain
>> > that
>> > the
>> > intrinsic function is "leaf function can not call ....." "nested
> function
>> > can
>> > not modify ...."
>> > Some errors like that.
>> > THe intrinsic function works well while running, seems the errors come
>> > with
>> > some register using not match some format.
>> >
>> > After search in MSDN, did not find any helpful information.
>> > So, is there any body know how to write the intrinsic function
>> > correctly(can
>> > pass the HCT12.1's x64 calling convention tests)?
>> >
>> >
>>
>>
>
>
.
- Follow-Ups:
- Re: x64 Calling convetion(ABI) issues.
- From: Maxim S. Shatskih
- Re: x64 Calling convetion(ABI) issues.
- References:
- x64 Calling convetion(ABI) issues.
- From: Tonald
- Re: x64 Calling convetion(ABI) issues.
- From: Ivan Brugiolo [MSFT]
- Re: x64 Calling convetion(ABI) issues.
- From: Sam
- x64 Calling convetion(ABI) issues.
- Prev by Date: RE: Crash ion wanarp.sys module
- Next by Date: RE: USB device access via DeviceIoControl and WriteFile / ReadFile
- Previous by thread: Re: x64 Calling convetion(ABI) issues.
- Next by thread: Re: x64 Calling convetion(ABI) issues.
- Index(es):
Relevant Pages
|