aboutsummaryrefslogtreecommitdiffhomepage
path: root/print.html
diff options
context:
space:
mode:
authorjohannst <johannst@users.noreply.github.com>2020-09-29 19:25:07 +0000
committerjohannst <johannst@users.noreply.github.com>2020-09-29 19:25:07 +0000
commit437b37306ec441823d401fe64fbf99936754b206 (patch)
treef6ab9c88692f1fc5ca31840b5d898aee99f33d12 /print.html
parent28f631e02bbf7e4cbd763fc74c4941d3f55a030f (diff)
downloadnotes-437b37306ec441823d401fe64fbf99936754b206.tar.gz
notes-437b37306ec441823d401fe64fbf99936754b206.zip
deploy: 871f1a6f408a9b50182c8688d4aeec26bd6b2d93
Diffstat (limited to 'print.html')
-rw-r--r--print.html227
1 files changed, 222 insertions, 5 deletions
diff --git a/print.html b/print.html
index e08e9c0..1b1bc35 100644
--- a/print.html
+++ b/print.html
@@ -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 &amp; 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 &amp; 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 |
| +------------+ &lt;--- 16 byte aligned (X &amp; ~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 &amp; 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&lt;&lt;3)]
+ldr x0, [x1, w2, stxw] // x0 = [x1 + sign_ext(w2)]
+ldr x0, [x1, w2, stxw #3] // x0 = [x1 + (sign_ext(w2)&lt;&lt;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
+ | +--&gt;| a10 | |
+ +----------&gt;| a9 | &lt;-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 |
+ +-&gt;| 0 | |
+ | | ... | |
+ | +------+ |
+ | | LR | frame1 |
+ +--| FP |&lt;-+ |
+ | ... | | |
+ +------+ | |
+ | LR | | current |
+x29 -&gt;| 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 &amp; 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 &lt;asm/unistd.h&gt; // syscall NRs
+
+ .arch armv8-a
+
+ .section .text, &quot;ax&quot;, @progbits
+ .balign 4 // align code on 4byte boundary
+ .global _start
+_start:
+ mov x0, 2 // fd
+ ldr x1, =greeting // buf
+ ldr x2, =greeting_len // &amp;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, &quot;a&quot;, @progbits
+greeting:
+ .asciz &quot;Hi ASM-World!\n&quot;
+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">&gt; aarch64-linux-gnu-g++ -o greet greet.S -nostartfiles -nostdlib \
+ -Wl,--dynamic-linker=/usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 \
+ &amp;&amp; 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>