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
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:
<>
http://embdev.net/topic/129714
http://embdev.net/topic/184418
-------------------------------------------------------------
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
<<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
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.htmlVFPv3-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 |
|
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.pdfcache_v7.c
https://android.googlesource.com/device/ti/bootloader/uboot/+/c0eec2d5698a6722a195f4545064dccfb4010c16/arch/arm/cpu/armv7/cache_v7.cGNU 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