aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Timber <dxdt@dev.snart.me>2024-11-14 05:34:57 +0100
committerDavid Timber <dxdt@dev.snart.me>2024-11-14 05:39:05 +0100
commit45a2cea350e47cb3d2f36bc6231d5339831f772a (patch)
treece6874667a51d6ba99aaa91027e1a3576d3f5a78
parente439d74b7ffaf04b699a96253b03d911cc8a9dec (diff)
Add writeups/unaligned-mem
-rw-r--r--writeups/unaligned-mem/.gitignore3
-rw-r--r--writeups/unaligned-mem/Makefile55
-rwxr-xr-xwriteups/unaligned-mem/run-all8
-rw-r--r--writeups/unaligned-mem/unaligned-mem.md0
-rw-r--r--writeups/unaligned-mem/unamem.c118
5 files changed, 184 insertions, 0 deletions
diff --git a/writeups/unaligned-mem/.gitignore b/writeups/unaligned-mem/.gitignore
new file mode 100644
index 0000000..5c3dfdd
--- /dev/null
+++ b/writeups/unaligned-mem/.gitignore
@@ -0,0 +1,3 @@
+/unamem
+/unamem-*
+/*.core
diff --git a/writeups/unaligned-mem/Makefile b/writeups/unaligned-mem/Makefile
new file mode 100644
index 0000000..175b46b
--- /dev/null
+++ b/writeups/unaligned-mem/Makefile
@@ -0,0 +1,55 @@
+CC ?= cc
+CC_FLAGS = -g -O0 -Wall -Wextra
+CC_CMD = $(CC) $(CC_FLAGS) $(CC_EXTRA_CLAGS)
+OBJ = \
+ unamem \
+ unamem-armv4t \
+ unamem-armv7 \
+ unamem-aarch64 \
+ unamem-arc \
+ unamem-arceb \
+ unamem-i686 \
+ unamem-x86_64 \
+ unamem-m68k \
+ unamem-mips \
+ unamem-mpsl \
+ unamem-ppc \
+ unamem-sh4
+
+.PHONY: clean test
+
+all: $(OBJ) test
+
+clean:
+ rm -f $(OBJ)
+
+
+unamem: unamem.c
+ $(CC_CMD) -o unamem unamem.c
+unamem-armv4t: unamem.c
+ xcomp linux-app armv4t arm-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-armv4t unamem.c
+unamem-armv7: unamem.c
+ xcomp linux-app armv7 arm-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-armv7 unamem.c
+unamem-aarch64: unamem.c
+ xcomp linux-app aarch64 aarch64-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-aarch64 unamem.c
+unamem-arc: unamem.c
+ xcomp linux-app arc arc-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-arc unamem.c
+unamem-arceb: unamem.c
+ xcomp linux-app arceb arceb-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-arceb unamem.c
+unamem-i686: unamem.c
+ xcomp linux-app i686 i686-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-i686 unamem.c
+unamem-x86_64: unamem.c
+ xcomp linux-app x86_64 x86_64-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-x86_64 unamem.c
+unamem-m68k: unamem.c
+ xcomp linux-app m68k m68k-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-m68k unamem.c
+unamem-mips: unamem.c
+ xcomp linux-app mips mips-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-mips unamem.c
+unamem-mpsl: unamem.c
+ xcomp linux-app mpsl mipsel-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-mpsl unamem.c
+unamem-ppc: unamem.c
+ xcomp linux-app ppc powerpc-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-ppc unamem.c
+unamem-sh4: unamem.c
+ xcomp linux-app sh4 sh4-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-sh4 unamem.c
+
+test: run-all $(OBJ)
+ ./run-all
diff --git a/writeups/unaligned-mem/run-all b/writeups/unaligned-mem/run-all
new file mode 100755
index 0000000..85360c7
--- /dev/null
+++ b/writeups/unaligned-mem/run-all
@@ -0,0 +1,8 @@
+#!/bin/bash
+ulimit -c 0
+
+for prog in unamem-*
+do
+ echo "==================== $prog ===================="
+ ./"$prog"
+done
diff --git a/writeups/unaligned-mem/unaligned-mem.md b/writeups/unaligned-mem/unaligned-mem.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/writeups/unaligned-mem/unaligned-mem.md
diff --git a/writeups/unaligned-mem/unamem.c b/writeups/unaligned-mem/unamem.c
new file mode 100644
index 0000000..cadfba1
--- /dev/null
+++ b/writeups/unaligned-mem/unamem.c
@@ -0,0 +1,118 @@
+#define _POSIX_C_SOURCE 200112L
+#include <stdio.h>
+#include <stdint.h>
+#include <limits.h>
+#include <error.h>
+#include <assert.h>
+
+#include <unistd.h>
+#include <wait.h>
+
+#define ARGV0 "unamem"
+#define DONT_FORK 1
+
+
+static void report_wait (const int status) {
+ if (WIFEXITED(status)) {
+ printf("exit %d\n", WEXITSTATUS(status));
+ }
+ else if (WIFSIGNALED(status)) {
+ printf("signal %d\n", WTERMSIG(status));
+ }
+ else {
+ printf("?\n");
+ }
+}
+
+int main (void) {
+ static char m[9]; // bss address is nicer than stack
+ char *c;
+ uintptr_t *p;
+ pid_t pid;
+ int status;
+
+ printf(
+ "CHAR_BIT: %d\n"
+ "word: %zd\n"
+ "uintptr_t: %zd\n"
+ "size_t: %zd\n"
+ "short: %zd\n"
+ "int: %zd\n"
+ "long: %zd\n"
+ "long long: %zd\n"
+ ,
+ CHAR_BIT,
+ CHAR_BIT * sizeof(uintptr_t),
+ sizeof(uintptr_t),
+ sizeof(size_t),
+ sizeof(short),
+ sizeof(int),
+ sizeof(long),
+ sizeof(long long));
+
+ c = m;
+ p = (void*)(m + 1);
+
+ printf(
+ "malloc: %zx", (uintptr_t)m);
+ for (size_t i = sizeof(uintptr_t); i > 1; i /= 2) {
+ if ((uintptr_t)m % i == 0) {
+ printf(" {%zu}", i);
+ }
+ }
+ printf("\n");
+
+ printf(
+ "c: %zx\n"
+ "p: %zx\n"
+ ,
+ (uintptr_t)c,
+ (uintptr_t)p);
+
+ pid = DONT_FORK ? 0 : fork();
+ if (pid > 0) {
+ printf(
+ "access: "
+ );
+ wait(&status);
+ report_wait(status);
+ }
+ else if (pid == 0) {
+ *p = UINTPTR_MAX;
+ *c = 0;
+ assert(*p == UINTPTR_MAX);
+ assert(*c == 0);
+
+ *c = 0;
+ *p = UINTPTR_MAX;
+ assert(*p == UINTPTR_MAX);
+ assert(*c == 0);
+ }
+ else {
+ perror(ARGV0": fork()");
+ return 1;
+ }
+
+ pid = DONT_FORK ? 0 : fork();
+ if (pid > 0) {
+ printf(
+ "float: "
+ );
+ wait(&status);
+ report_wait(status);
+ }
+ else if (pid == 0) {
+ volatile float a, b, c;
+
+ a = 0.1;
+ b = 1.0;
+ c = b / a;
+ assert(c > 1.0);
+ }
+ else {
+ perror(ARGV0": fork()");
+ return 1;
+ }
+
+ return 0;
+}