On 2 December 2015 at 19:50, Michael Zimmermann
<[email protected]> wrote:
>> But, I believe -- I could be wrong -- that for ARM/AARCH64 the assembly
>> syntax has been uniquely determined anyway. (If this is not the case, I
>> hope I'll be corrected.)
>
> Unfortunately not. From ArmPlatformPkg/PrePi/Arm/ to ./Library/ArmLib -
> there are always both asm and S files.
>

The .asm files are only there for ARM: the proprietary 32-bit
toolchain RVCT has its own syntax that is different from what GNU
binutils uses.

Fortunately, for AARCH64, there is only one asm syntax to support. The
proprietary 64-bit toolchain is clang-based, which uses a syntax that
is compatible with binutils/gas for AArch64.

-- 
Ard.

> On Wed, Dec 2, 2015 at 7:34 PM, Laszlo Ersek <[email protected]> wrote:
>
>> On 12/02/15 18:37, Michael Zimmermann wrote:
>> > Does NASM support ARM and AARCH64? because according to Wikipedia it
>> > doesn't.
>>
>> It doesn't.
>>
>> But, I believe -- I could be wrong -- that for ARM/AARCH64 the assembly
>> syntax has been uniquely determined anyway. (If this is not the case, I
>> hope I'll be corrected.)
>>
>> Thanks
>> Laszlo
>>
>> >> Not sure why the Vlv2TbltDevicePkg needed to add that assembly code? I
>> > would also point out that the inline assembly will optimize better as the
>> > compiler will always call the .S function, but the optimizer can inline
>> the
>> > C function if needed.
>> >
>> > Are you sure assembly never get's inlined? I'd expect optimizers to work
>> on
>> > assembly/bytecode level and at least GCC's O3 function enables -finline.
>> >
>> > On Wed, Dec 2, 2015 at 6:32 PM, Andrew Fish <[email protected]> wrote:
>> >
>> >>
>> >>> On Dec 2, 2015, at 8:44 AM, Michael Zimmermann <
>> [email protected]>
>> >> wrote:
>> >>>
>> >>> Hi,
>> >>>
>> >>> sorry if this is documented somewhere but I've always wondered what
>> this
>> >>> whole assembler file situation in EDKII is about.
>> >>> What I mean is that there are two versions of every assembler file -
>> for
>> >> VS
>> >>> and GCC compilers I guess.
>> >>>
>> >>> What I've noticed though is that most of these files are almost
>> identical
>> >>> except for minor differences like different export macros and comment
>> >>> characters.
>> >>>
>> >>> I think (I hope I'm wrong) that there even are some projects where one
>> >>> version of these files is outdated/not maintained.
>> >>>
>> >>> If I'm right and the differences really are that small, couldn't we
>> just
>> >>> write some kind of converter so we can remove all this duplicate code?
>> >>>
>> >>
>> >> I think the longer term direction is to move to nasm. There are still
>> some
>> >> issues of nasm working with Xcode as the DWARF info does not get placed
>> >> into the Mach-O files.
>> >>
>> >> The MdePkg Libraries are designed so that you don't need to write
>> >> assembler. On an ARM based system you may also need some help from the
>> >> ArmPkg. So the general answer don't write assembler. You can usually use
>> >> the BaseLib to do what you need to do.
>> >>
>> >> On the x86 side there are a few exceptions:
>> >> 1) Reset - You start in real mode with no stack
>> >> 2) Interrupts - You need to save state.
>> >> 3) Mode Switches - PEI is 32-bit (No place to store the page tables) and
>> >> DXE is 64-bit
>> >> 4) SMM - More strange mode switching
>> >> 5) Optimization - Usually not needed (MdePkg has optimized CopyMem etc.)
>> >>
>> >> Now I would say an issue I've seen is that the Silicon folks like to
>> >> "reinvent the wheel".
>> >>> find . -iname '*.S'
>> >> ...
>> >>
>> >>
>> ./Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/Stack.S
>> >> ./Vlv2TbltDevicePkg/Library/CpuIA32Lib/IA32/CpuIA32.S
>> >> ./Vlv2TbltDevicePkg/Library/CpuIA32Lib/X64/Cpu.S
>> >>
>> >> If you look at these files you will see that MdePkg has SwitchStack
>> >> functions, and the CpuIA32Lib is the old EDK names for functions that
>> exist
>> >> in the MdePkg BaseLib. So this is an example of unneeded assembly code
>> in
>> >> the tree.
>> >>
>> >>
>> >>
>> #------------------------------------------------------------------------------
>> >> #  UINT64
>> >> #  EfiReadMsr (
>> >> #    IN   UINT32  Index,  // rcx
>> >> #    )
>> >>
>> >>
>> #------------------------------------------------------------------------------
>> >> ASM_PFX(EfiReadMsr):
>> >>       rdmsr
>> >>       shl    $0x20,%rdx
>> >>       or     %rdx,%rax
>> >>       retq
>> >>
>> >>
>> >> Looks a lot like:
>> >>
>> >> UINT64
>> >> EFIAPI
>> >> AsmReadMsr64 (
>> >>   IN      UINT32                    Index
>> >>   )
>> >> {
>> >>   UINT32 LowData;
>> >>   UINT32 HighData;
>> >>
>> >>   __asm__ __volatile__ (
>> >>     "rdmsr"
>> >>     : "=a" (LowData),   // %0
>> >>       "=d" (HighData)   // %1
>> >>     : "c"  (Index)      // %2
>> >>     );
>> >>
>> >>   return (((UINT64)HighData) << 32) | LowData;
>> >> }
>> >>
>> >> Not sure why the Vlv2TbltDevicePkg needed to add that assembly code? I
>> >> would also point out that the inline assembly will optimize better as
>> the
>> >> compiler will always call the .S function, but the optimizer can inline
>> the
>> >> C function if needed.
>> >>
>> >> Thanks,
>> >>
>> >> Andrew Fish
>> >>
>> >>
>> >>> Michael
>> >>> _______________________________________________
>> >>> edk2-devel mailing list
>> >>> [email protected]
>> >>> https://lists.01.org/mailman/listinfo/edk2-devel
>> >>
>> >>
>> > _______________________________________________
>> > edk2-devel mailing list
>> > [email protected]
>> > https://lists.01.org/mailman/listinfo/edk2-devel
>> >
>>
>>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to