Friday, October 30, 2015

GCC ARM porting

ARM Cortex-A Processors and GCC Command Lines




Debugging on bare-metal targets using DS-5 and GCC compiler
http://ds.arm.com/debugging-on-bare-metal-targets-using-ds-5-and-gcc-compiler/




Renesas – GNURX Migration Guide
http://www.kpitgnutools.com/manuals/Renesas-GNURX-Migration-Guide.html




ARMv7A - Thumb 2
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/CACCICED.html






arm-none-eabi-gcc --target-help
arm-none-eabi-as --target-help






https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html


Four Important properties:
Byte order = little
Floating-point ABI = Default
Instruction set = Arm
Interworking = Checked




$(TCINSTALL)\arm-none-eabi\arm-none-eabi\lib\gcc\arm-none-eabi\ 4.8-GNUARM-NONE_v14.01\interwork




Cerating archive file using GCC
http://www.cs.dartmouth.edu/~campbell/cs50/buildlib.html


Different single line comment for each platform
https://en.wikipedia.org/wiki/GNU_Assembler
Single-Line comments[edit]
Single line comments have a few different formats varying on which architecture is being assembled for.
•Hash symbols (#) are used for the platforms: i386, x86-64, i960, 68HC11, 68HC12, VAX, V850, M32R, PowerPC, MIPS and M880x0.
•Semicolons (;) are used on: AMD 29k family, ARC, H8/300 family, HPPA, PDP-11, picoJava, Motorola, and M32C.
•The at sign (@) is used on the ARM platform.
•A vertical bar (|) is used to signify comments when assembling on 680x0.
•An exclamation mark (!) on the Renesas SH platform.
Preprocess source file GCC
http://www.linuxtopia.org/online_books/an_introduction_to_gcc/gccintro_36.html




NEON:
#define __ARM_NEON__ 1
#define __ARM_NEON 1


NEON_D16:




Very good assembly
http://shervinemami.info/armAssembly.html




Check:


1) in Thumb mode, functions addresses are in thumb and CPU is in thumb mode














d




VFPv3 and VFPv4 has D32 only in  case of having NEON. Otherwise they have only 16 64-bit registers.
http://dench.flatlib.jp/opengl/fpu_vfp

























Re: ARM: VFPv3-D16 vs. VFPv3-D32
https://gcc.gnu.org/ml/gcc/2013-10/msg00183.html


VFPv3-D32 is implied for NEON targets, e.g. Cortex-A8 and Cortex-A9
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0133c/index.html



SWI Call:

<>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* vi: set sw=4 ts=4: */
/* syscall for arm/uClibc
 *
 * Copyright (C) 2002 by Erik Andersen 
 *
 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 */

#include 
#include 
#include 
#include 


long syscall(long sysnum, long a, long b, long c, long d, long e, long f)
{
#if !defined(__thumb__)
 register long _r0 __asm__("r0")=(long)(sysnum);
 register long _r6 __asm__("r6")=(long)(f);
 register long _r5 __asm__("r5")=(long)(e);
 register long _r4 __asm__("r4")=(long)(d);
 register long _r3 __asm__("r3")=(long)(c);
 register long _r2 __asm__("r2")=(long)(b);
 register long _r1 __asm__("r1")=(long)(a);
 __asm__ __volatile__(
   "swi %1"
   : "=r"(_r0)
   : "i"(__NR_syscall), "r"(_r0), "r"(_r1),
   "r"(_r2), "r"(_r3), "r"(_r4), "r"(_r5),
   "r"(_r6)
   : "memory");
#else
 register long _r7 __asm__("r7")=(long)(sysnum);
 register long _r5 __asm__("r5")=(long)(f);
 register long _r4 __asm__("r4")=(long)(e);
 register long _r3 __asm__("r3")=(long)(d);
 register long _r2 __asm__("r2")=(long)(c);
 register long _r1 __asm__("r1")=(long)(b);
 register long _r0 __asm__("r0")=(long)(a);
 __asm__ __volatile__(
   "swi 0"
   : "=r"(_r0)
   : "r"(_r0), "r"(_r1), "r"(_r2), "r"(_r3),
   "r"(_r4), "r"(_r5), "r"(_r7)
   : "memory");
#endif
 if(_r0 >=(unsigned long) -4095) {
  long err = _r0;
  (*__errno_location())=(-err);
  _r0=(unsigned long) -1;
 }
 return (long) _r0;
}



http://embdev.net/topic/129714
static inline int Do_SWI_9 (int arg1, struct something *arg2)
{
  register long __res asm("r0");
  asm volatile ("mov r0,%2\n\tmov r1,%3" : \
      "=X" (*(char *)(long)arg1), "=X" (*(char *)(long)arg2) : \
      "r" ((long)arg1), "r" ((long)arg2) : \
      "r0", "r1");
  asm volatile ("swi 9 @ %0" : "=r" (__res) : :
      "r12", "r14", "cc");
  return((int)__res);
}

What's different?
(1) The __res variable is now explicitly placed in r0.
(2) The swi call is marked as returning a value in __res.
(3) The "@%0" comment after swi FOOLS asm() into thinking swi really
does affect r0.
(4) The "mov %0,r0" after the swi is omitted as it's no longer
necessary.

Is this voodoo or what?  But it appears to work great under level 2
optimization.


http://embdev.net/topic/184418

In this case, the parameres are transmitted through the stack, but I do 
not need. When used inline it fits into the function.

How do I type this, an unspecified number of parameters?

_inline_ void sm(int i, int l)

{
   register int p0 asm("r0") = i;
   register int p1 asm("r1") = l;

   asm ("swi 0x148"::"r"(p0),"r"(p1));

}


_inline_ void sm(int i,...)

-------------------------------------------------------------


http://venkateshabbarapu.blogspot.jp/2012/09/interrupt-handling-in-arm.html




それでは、L1 命令キャッシュ、L1 データキャッシュ、L2 統一キャッシュをどのような手順で有効化するかというと、

・L1 命令キャッシュをすべて invalidate する
・L1 データキャッシュをすべて invalidate する
・L2 統一キャッシュをすべて invalidate する
・Control Register の I ビットを立てて L1 命令キャッシュを有効化する
・MMU を有効化する
   - ページテーブルを構成する
   - Translation Table Base Register にページテーブル先頭アドレスを設定する
   - Control Register の M ビットを立てて MMU を有効化する
・Auxiliary Control Register の L2EN ビットを立てる
・Control Register の C ビットを立てて、L1 データキャッシュ、L2 統一キャッシュを有効化する

という方法でいいと思います。

分岐予測を有効にする場合は、更に以下を行います:

・分岐予測器を invalidate する
・Control Register の Z ビットを立てて分岐予測を有効化する


----
http://ssvb.github.io/2012/04/10/cpuburn-arm-cortex-a9.html




http://events.linuxfoundation.jp/sites/events/files/slides/elc14_raj.pdf



Migrating a software application from ARMv5 to ARMv7-A/R

http://infocenter.arm.com/help/topic/com.arm.doc.dai0425/DAI0425_migrating_an_application_from_ARMv5_to_ARMv7_AR.pdf


cache_v7.c

https://android.googlesource.com/device/ti/bootloader/uboot/+/c0eec2d5698a6722a195f4545064dccfb4010c16/arch/arm/cpu/armv7/cache_v7.c


GNU ARM AS reference

<<http://www.coranac.com/files/gba/re-ejected-gasref.pdf>>




<<http://stackoverflow.com/questions/10831792/how-to-use-specific-register-in-arm-inline-assembler>>

6.1 Statements and Declarations in Expressions

<<https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html>>


#define SYSCALL1(NUMBER,A) ({\
  register long r0 asm("r0") = (long) (A); \
  asm("swi #" STRINGIFY(NUMBER) : "=r"(r0) : "r"(r0) : "memory"); \
  r0; })
(I have no idea if the clobber is legitimate or not, the uClibc syscall implementation has that though.)

How to use specific register in ARM inline assembler

<<http://stackoverflow.com/questions/10831792/how-to-use-specific-register-in-arm-inline-assembler>>

pintOS/src/lib/user/syscall.c
https://github.com/LucasSeveryn/pintOS/blob/master/src/lib/user/syscall.c




ARM Assembly
http://www.coranac.com/tonc/text/asm.htm


__attribute___
http://www.picfun.com/c30/c3004.html


 int foo __attribute__((section("mysection"), address(0x900))) ;
 int a __attribute__ ((aligned(8), section(".mysection")));
http://www.landley.net/hg/tinycc/diff/803a46d4a4c9/www/tinycc-doc.html


http://wiki.osdev.org/Inline_Assembly
http://stackoverflow.com/questions/21541968/is-flags-eflags-part-of-cc-condition-control-for-clobber-list
















Reference
http://www.coranac.com/files/gba/re-ejected-gasref.pdf

No comments:

Post a Comment