diff options
author | johannst <johannst@users.noreply.github.com> | 2020-09-29 19:25:07 +0000 |
---|---|---|
committer | johannst <johannst@users.noreply.github.com> | 2020-09-29 19:25:07 +0000 |
commit | 437b37306ec441823d401fe64fbf99936754b206 (patch) | |
tree | f6ab9c88692f1fc5ca31840b5d898aee99f33d12 /print.html | |
parent | 28f631e02bbf7e4cbd763fc74c4941d3f55a030f (diff) | |
download | notes-437b37306ec441823d401fe64fbf99936754b206.tar.gz notes-437b37306ec441823d401fe64fbf99936754b206.zip |
deploy: 871f1a6f408a9b50182c8688d4aeec26bd6b2d93
Diffstat (limited to 'print.html')
-rw-r--r-- | print.html | 227 |
1 files changed, 222 insertions, 5 deletions
@@ -83,7 +83,7 @@ <nav id="sidebar" class="sidebar" aria-label="Table of contents"> <div id="sidebar-scrollbox" class="sidebar-scrollbox"> - <ol class="chapter"><li class="expanded "><a href="tools/index.html"><strong aria-hidden="true">1.</strong> Tools</a></li><li><ol class="section"><li class="expanded "><a href="tools/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="expanded "><a href="tools/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="expanded "><a href="tools/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li><li class="expanded "><a href="tools/tmux.html"><strong aria-hidden="true">1.4.</strong> tmux</a></li><li class="expanded "><a href="tools/git.html"><strong aria-hidden="true">1.5.</strong> git</a></li><li class="expanded "><a href="tools/awk.html"><strong aria-hidden="true">1.6.</strong> awk</a></li><li class="expanded "><a href="tools/emacs.html"><strong aria-hidden="true">1.7.</strong> emacs</a></li><li class="expanded "><a href="tools/gdb.html"><strong aria-hidden="true">1.8.</strong> gdb</a></li><li class="expanded "><a href="tools/radare2.html"><strong aria-hidden="true">1.9.</strong> radare2</a></li></ol></li><li class="expanded "><a href="monitor/index.html"><strong aria-hidden="true">2.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">2.1.</strong> lsof</a></li><li class="expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">2.2.</strong> pidstat</a></li><li class="expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">2.3.</strong> pgrep</a></li><li class="expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">2.4.</strong> pmap</a></li><li class="expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">2.5.</strong> pstack</a></li></ol></li><li class="expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">3.</strong> Trace and Profile</a></li><li><ol class="section"><li class="expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">3.1.</strong> strace</a></li><li class="expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">3.2.</strong> ltrace</a></li><li class="expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">3.3.</strong> perf</a></li><li class="expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">3.4.</strong> OProfile</a></li><li class="expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">3.5.</strong> time</a></li></ol></li><li class="expanded "><a href="binary/index.html"><strong aria-hidden="true">4.</strong> Binary</a></li><li><ol class="section"><li class="expanded "><a href="binary/od.html"><strong aria-hidden="true">4.1.</strong> od</a></li><li class="expanded "><a href="binary/xxd.html"><strong aria-hidden="true">4.2.</strong> xxd</a></li><li class="expanded "><a href="binary/readelf.html"><strong aria-hidden="true">4.3.</strong> readelf</a></li><li class="expanded "><a href="binary/objdump.html"><strong aria-hidden="true">4.4.</strong> objdump</a></li><li class="expanded "><a href="binary/nm.html"><strong aria-hidden="true">4.5.</strong> nm</a></li></ol></li><li class="expanded "><a href="development/index.html"><strong aria-hidden="true">5.</strong> Development</a></li><li><ol class="section"><li class="expanded "><a href="development/c++filt.html"><strong aria-hidden="true">5.1.</strong> c++filt</a></li><li class="expanded "><a href="development/c++.html"><strong aria-hidden="true">5.2.</strong> c++</a></li><li class="expanded "><a href="development/glibc.html"><strong aria-hidden="true">5.3.</strong> glibc</a></li><li class="expanded "><a href="development/gcc.html"><strong aria-hidden="true">5.4.</strong> gcc</a></li><li class="expanded "><a href="development/make.html"><strong aria-hidden="true">5.5.</strong> make</a></li><li class="expanded "><a href="development/ld.so.html"><strong aria-hidden="true">5.6.</strong> ld.so</a></li></ol></li><li class="expanded "><a href="arch/index.html"><strong aria-hidden="true">6.</strong> Arch</a></li><li><ol class="section"><li class="expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">6.1.</strong> x86_64</a></li></ol></li></ol> + <ol class="chapter"><li class="expanded "><a href="tools/index.html"><strong aria-hidden="true">1.</strong> Tools</a></li><li><ol class="section"><li class="expanded "><a href="tools/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="expanded "><a href="tools/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="expanded "><a href="tools/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li><li class="expanded "><a href="tools/tmux.html"><strong aria-hidden="true">1.4.</strong> tmux</a></li><li class="expanded "><a href="tools/git.html"><strong aria-hidden="true">1.5.</strong> git</a></li><li class="expanded "><a href="tools/awk.html"><strong aria-hidden="true">1.6.</strong> awk</a></li><li class="expanded "><a href="tools/emacs.html"><strong aria-hidden="true">1.7.</strong> emacs</a></li><li class="expanded "><a href="tools/gdb.html"><strong aria-hidden="true">1.8.</strong> gdb</a></li><li class="expanded "><a href="tools/radare2.html"><strong aria-hidden="true">1.9.</strong> radare2</a></li></ol></li><li class="expanded "><a href="monitor/index.html"><strong aria-hidden="true">2.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">2.1.</strong> lsof</a></li><li class="expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">2.2.</strong> pidstat</a></li><li class="expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">2.3.</strong> pgrep</a></li><li class="expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">2.4.</strong> pmap</a></li><li class="expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">2.5.</strong> pstack</a></li></ol></li><li class="expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">3.</strong> Trace and Profile</a></li><li><ol class="section"><li class="expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">3.1.</strong> strace</a></li><li class="expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">3.2.</strong> ltrace</a></li><li class="expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">3.3.</strong> perf</a></li><li class="expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">3.4.</strong> OProfile</a></li><li class="expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">3.5.</strong> time</a></li></ol></li><li class="expanded "><a href="binary/index.html"><strong aria-hidden="true">4.</strong> Binary</a></li><li><ol class="section"><li class="expanded "><a href="binary/od.html"><strong aria-hidden="true">4.1.</strong> od</a></li><li class="expanded "><a href="binary/xxd.html"><strong aria-hidden="true">4.2.</strong> xxd</a></li><li class="expanded "><a href="binary/readelf.html"><strong aria-hidden="true">4.3.</strong> readelf</a></li><li class="expanded "><a href="binary/objdump.html"><strong aria-hidden="true">4.4.</strong> objdump</a></li><li class="expanded "><a href="binary/nm.html"><strong aria-hidden="true">4.5.</strong> nm</a></li></ol></li><li class="expanded "><a href="development/index.html"><strong aria-hidden="true">5.</strong> Development</a></li><li><ol class="section"><li class="expanded "><a href="development/c++filt.html"><strong aria-hidden="true">5.1.</strong> c++filt</a></li><li class="expanded "><a href="development/c++.html"><strong aria-hidden="true">5.2.</strong> c++</a></li><li class="expanded "><a href="development/glibc.html"><strong aria-hidden="true">5.3.</strong> glibc</a></li><li class="expanded "><a href="development/gcc.html"><strong aria-hidden="true">5.4.</strong> gcc</a></li><li class="expanded "><a href="development/make.html"><strong aria-hidden="true">5.5.</strong> make</a></li><li class="expanded "><a href="development/ld.so.html"><strong aria-hidden="true">5.6.</strong> ld.so</a></li></ol></li><li class="expanded "><a href="arch/index.html"><strong aria-hidden="true">6.</strong> Arch</a></li><li><ol class="section"><li class="expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">6.1.</strong> x86_64</a></li><li class="expanded "><a href="arch/arm64.html"><strong aria-hidden="true">6.2.</strong> arm64</a></li></ol></li></ol> </div> <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> </nav> @@ -1738,6 +1738,7 @@ As we can see the offset from relocation at index <code>0</code> points to <code <h1><a class="header" href="#arch" id="arch">Arch</a></h1> <ul> <li><a href="arch/./x86_64.html">x86_64</a></li> +<li><a href="arch/./arm64.html">arm64</a></li> </ul> <h1><a class="header" href="#x86_64" id="x86_64">x86_64</a></h1> <p>keywords: x86_64, x86, abi</p> @@ -1794,7 +1795,7 @@ movw rax, [rbx+4*rcx] // load val at [rbx+4*rcx] into rax </code></pre> <h2><a class="header" href="#size-directives" id="size-directives">Size directives</a></h2> <p>Explicitly specify size of the operation.</p> -<pre><code class="language-nasm">mov byte ptr [rax], 0xff // save 1 byte(s) at [rax] +<pre><code class="language-x86asm">mov byte ptr [rax], 0xff // save 1 byte(s) at [rax] mov word ptr [rax], 0xff // save 2 byte(s) at [rax] mov dword ptr [rax], 0xff // save 4 byte(s) at [rax] mov qword ptr [rax], 0xff // save 8 byte(s) at [rax] @@ -1818,7 +1819,7 @@ r9 6 ----------- xmm0 1 .. .. -xmm7 7 +xmm7 8 </code></pre> </li> <li>Additional arguments are passed on the stack. Arguments are pushed @@ -1865,7 +1866,7 @@ must must save these registers in case they are used.</p> <ul> <li>grows downwards</li> <li>frames aligned on 16 byte boundary -<pre><code class="language-text">HI ADDR +<pre><code class="language-text">Hi ADDR | +------------+ | | prev frame | | +------------+ <--- 16 byte aligned (X & ~0xf) @@ -1874,10 +1875,26 @@ must must save these registers in case they are used.</p> | [rbp-8] | func stack | | | ... | v +------------+ -LO ADDR +Lo ADDR </code></pre> </li> </ul> +<h3><a class="header" href="#function-prologue--epilogue" id="function-prologue--epilogue">Function prologue & epilogue</a></h3> +<ul> +<li>prologue +<pre><code class="language-x86asm">push rbp // save caller base pointer +mov rbp, rsp // save caller stack pointer +</code></pre> +</li> +<li>epilogue +<pre><code class="language-x86asm">mov rsp, rbp // restore caller stack pointer +pop rbp // restore caller base pointer +</code></pre> +<blockquote> +<p>Equivalent to <code>leave</code> instruction.</p> +</blockquote> +</li> +</ul> <h2><a class="header" href="#asm-skeleton" id="asm-skeleton">ASM skeleton</a></h2> <p>Small assembler skeleton, ready to use with following properties:</p> <ul> @@ -1926,6 +1943,206 @@ Hi ASM-World! <li><a href="https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-software-developers-manual-volume-1-basic-architecture.html">Intel 64 Vol1: Basic Architecture</a></li> <li><a href="https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-2a-2b-2c-and-2d-instruction-set-reference-a-z.html">Intel 64 Vol2: Instruction Set Reference</a></li> <li><a href="https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-3a-3b-3c-and-3d-system-programming-guide.html">Intel 64 Vol3: System Programming Guide</a></li> +<li><a href="https://sourceware.org/binutils/docs/as">GNU Assembler</a></li> +<li><a href="https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops">GNU Assembler Directives</a></li> +</ul> +<h1><a class="header" href="#arm64" id="arm64">arm64</a></h1> +<p>keywords: arm64, aarch64, abi</p> +<ul> +<li>64bit synonyms: <code>arm64</code>, <code>aarch64</code></li> +<li>ISA type: <code>RISC</code></li> +<li>Endianness: <code>little</code>, <code>big</code></li> +</ul> +<h2><a class="header" href="#registers-1" id="registers-1">Registers</a></h2> +<h3><a class="header" href="#general-purpose-registers" id="general-purpose-registers">General purpose registers</a></h3> +<pre><code class="language-markdown">bytes +[7:0] [3:0] desc +--------------------------------------------- +x0-x28 w0-w28 general purpose registers +x29 w29 frame pointer (FP) +x30 w30 link register (LR) +sp wsp stack pointer (SP) +pc program counter (PC) +xzr wzr zero register +</code></pre> +<blockquote> +<p>Write to <code>wN</code> register clears upper 32bit.</p> +</blockquote> +<h3><a class="header" href="#special-registers-per-el" id="special-registers-per-el">Special registers per EL</a></h3> +<pre><code class="language-markdown">bytes +[7:0] desc +--------------------------------------------- +sp_el0 stack pointer EL0 + +sp_el1 stack pointer EL1 +elr_el1 exception link register EL1 +spsr_el1 saved process status register EL1 + +sp_el2 stack pointer EL2 +elr_el2 exception link register EL2 +spsr_el2 saved process status register EL2 + +sp_el3 stack pointer EL3 +elr_el3 exception link register EL3 +spsr_el3 saved process status register EL3 +</code></pre> +<h2><a class="header" href="#addressing-1" id="addressing-1">Addressing</a></h2> +<h3><a class="header" href="#offset" id="offset">Offset</a></h3> +<pre><code class="language-armasm">ldr x0, [x1] // x0 = [x1] +ldr x0, [x1, 8] // x0 = [x1 + 8] +ldr x0, [x1, x2, lsl #3] // x0 = [x1 + (x2<<3)] +ldr x0, [x1, w2, stxw] // x0 = [x1 + sign_ext(w2)] +ldr x0, [x1, w2, stxw #3] // x0 = [x1 + (sign_ext(w2)<<3)] +</code></pre> +<blockquote> +<p>Shift amount can either be <code>0</code> or <code>log2(access_size_bytes)</code>. Eg for 8byte +access it can either be <code>{0, 3}</code>.</p> +</blockquote> +<h3><a class="header" href="#index" id="index">Index</a></h3> +<pre><code class="language-armasm">ldr x0, [x1, 8]! // pre-inc : x1+=8; x0 = [x1] +ldr x0, [x1], 8 // post-inc: x0 = [x1]; x1+=8 +</code></pre> +<h3><a class="header" href="#pair-access" id="pair-access">Pair access</a></h3> +<pre><code class="language-armasm">ldp x1, x2, [x0] // x1 = [x0]; x2 = [x0 + 8] +stp x1, x2, [x0] // [x0] = x1; [x0 + 8] = x2 +</code></pre> +<h2><a class="header" href="#procedure-call-standard-arm64-a-hrefhttpsgithubcomarm-softwareabi-aablobmasteraapcs64aapcs64rstaapcs64a" id="procedure-call-standard-arm64-a-hrefhttpsgithubcomarm-softwareabi-aablobmasteraapcs64aapcs64rstaapcs64a">Procedure Call Standard ARM64 (<a href="https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst"><code>aapcs64</code></a>)</a></h2> +<h3><a class="header" href="#passing-arguments-to-functions-1" id="passing-arguments-to-functions-1">Passing arguments to functions</a></h3> +<ul> +<li>Integer/Pointer arguments +<pre><code class="language-markdown">reg arg +----------- +x0 1 +.. .. +x7 8 +</code></pre> +</li> +<li>Additional arguments are passed on the stack. Arguments are pushed +<code>right-to-left (RTL)</code>, meaning next arguments are closer to current <code>sp</code>. +<pre><code class="language-markdown">void take(..., int a9, int a10); + | | | ... | Hi + | +-->| a10 | | + +---------->| a9 | <-SP | + +-----+ v + | ... | Lo +</code></pre> +</li> +</ul> +<h3><a class="header" href="#return-values-from-functions-1" id="return-values-from-functions-1">Return values from functions</a></h3> +<ul> +<li>Integer/Pointer return values +<pre><code class="language-markdown">reg size +----------------- +x0 64 bit +</code></pre> +</li> +</ul> +<h3><a class="header" href="#callee-saved-registers-1" id="callee-saved-registers-1">Callee saved registers</a></h3> +<ul> +<li><code>x19</code> - <code>x28</code></li> +<li><code>SP</code></li> +</ul> +<h3><a class="header" href="#stack-1" id="stack-1">Stack</a></h3> +<ul> +<li>grows downwards</li> +<li><code>sp</code> must be 16byte aligned when used to access memory for r/w</li> +<li><code>sp</code> must be 16byte aligned on public interface interfaces</li> +</ul> +<h3><a class="header" href="#frame-chain" id="frame-chain">Frame chain</a></h3> +<ul> +<li>linked list of stack-frames</li> +<li>each frame links to the frame of its caller by a <code>frame record</code> +<ul> +<li>a frame record is described as a <code>(FP,LR)</code> pair</li> +</ul> +</li> +<li><code>x29 (FP)</code> must point to the frame record of the current stack-frame +<pre><code class="language-markdown"> +------+ Hi + | 0 | frame0 | + +->| 0 | | + | | ... | | + | +------+ | + | | LR | frame1 | + +--| FP |<-+ | + | ... | | | + +------+ | | + | LR | | current | +x29 ->| FP |--+ frame v + | ... | Lo +</code></pre> +</li> +<li>end of the frame chain is indicated by following frame record <code>(0,-)</code></li> +<li>location of the frame record in the stack frame is not specified</li> +</ul> +<h3><a class="header" href="#function-prologue--epilogue-1" id="function-prologue--epilogue-1">Function prologue & epilogue</a></h3> +<ul> +<li>prologue +<pre><code class="language-armasm">sub sp, sp, 16 +stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30 +mov x29, sp // FP points to frame record +</code></pre> +</li> +<li>epilogue +<pre><code class="language-armasm">ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8] +add sp, sp, 16 +ret +</code></pre> +</li> +</ul> +<h2><a class="header" href="#asm-skeleton-1" id="asm-skeleton-1">ASM skeleton</a></h2> +<p>Small assembler skeleton, ready to use with following properties:</p> +<ul> +<li>use raw Linux syscalls (<code>man 2 syscall</code> for ABI)</li> +<li>no <code>C runtime (crt)</code></li> +<li>gnu assembler <a href="https://sourceware.org/binutils/docs/as"><code>gas</code></a></li> +</ul> +<pre><code class="language-armasm">// file: greet.S + +#include <asm/unistd.h> // syscall NRs + + .arch armv8-a + + .section .text, "ax", @progbits + .balign 4 // align code on 4byte boundary + .global _start +_start: + mov x0, 2 // fd + ldr x1, =greeting // buf + ldr x2, =greeting_len // &len + ldr x2, [x2] // len + mov w8, __NR_write // write(2) syscall + svc 0 + + mov x0, 0 // exit code + mov w8, __NR_exit // exit(2) syscall + svc 0 + + .balign 8 // align data on 8byte boundary + .section .rodata, "a", @progbits +greeting: + .asciz "Hi ASM-World!\n" +greeting_len: + .int .-greeting +</code></pre> +<blockquote> +<p>man gcc: <code>file.S</code> assembler code that must be preprocessed.</p> +</blockquote> +<p>To cross-compile and run:</p> +<pre><code class="language-bash">> aarch64-linux-gnu-g++ -o greet greet.S -nostartfiles -nostdlib \ + -Wl,--dynamic-linker=/usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 \ + && qemu-aarch64 ./greet +Hi ASM-World! +</code></pre> +<blockquote> +<p>Cross-compiling on <code>Ubuntu 20.04</code>, paths might differ on other distributions. +Compiling natively on arm64, specifying the dynamic linker should not be required.</p> +</blockquote> +<h2><a class="header" href="#references-1" id="references-1">References</a></h2> +<ul> +<li><a href="https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst">Procedure Call Standard ARM64</a></li> +<li><a href="https://developer.arm.com/documentation/den0024/a">ARMv8 Programmer's Guide</a></li> +<li><a href="https://sourceware.org/binutils/docs/as">GNU Assembler</a></li> +<li><a href="https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops">GNU Assembler Directives</a></li> </ul> </main> |