aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2021-12-30 17:23:51 +0100
committerMarvin Borner2021-12-30 17:23:51 +0100
commit028755c57007c3241e287b9927c6810814eecde1 (patch)
treec4c5a8826390f651f975425f96e275395db43c19
parent6236c3d88ccba4429cbb4020ea0ed02816282451 (diff)
Makemake crakecrake
-rw-r--r--inc/def.h65
-rw-r--r--inc/spec.h58
-rw-r--r--makefile15
-rw-r--r--src/create.c7
-rw-r--r--src/mkfs.c60
5 files changed, 192 insertions, 13 deletions
diff --git a/inc/def.h b/inc/def.h
new file mode 100644
index 0000000..e73d6e9
--- /dev/null
+++ b/inc/def.h
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2021, Marvin Borner <melvix@marvinborner.de>
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef MARFS_DEF_H
+#define MARFS_DEF_H
+
+/**
+ * Types
+ */
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long s64;
+typedef unsigned long u64;
+
+typedef float f32;
+typedef double f64;
+typedef long double f80;
+
+/**
+ * Useful macros
+ */
+
+#define UNUSED(a) ((void)(a))
+
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define COUNT(a) (sizeof(a) / sizeof 0 [a])
+
+#define BIT_GET(num, n) (((num) & (1UL << (n))) >> (n))
+#define BIT_SET(num, n) ((num) | (1UL << (n)))
+#define BIT_CLEAR(num, n) ((num) & ~(1UL << (n)))
+#define BIT_TOGGLE(num, n) ((num) ^ (1UL << (n)))
+
+/**
+ * Compiler attribute wrappers
+ */
+
+#define ATTR __attribute__
+#define NORETURN ATTR((noreturn))
+#define INLINE ATTR((gnu_inline)) inline
+#define NOINLINE ATTR((noinline))
+#define DEPRECATED ATTR((deprecated))
+#define NONNULL ATTR((nonnull))
+#define PACKED ATTR((packed))
+#define HOT ATTR((hot))
+#define OPTIMIZE(level) ATTR((optimize(level)))
+#define ALIGNED(align) ATTR((aligned(align)))
+
+/**
+ * General macro constants
+ */
+
+#define NULL ((void *)0)
+
+#endif
diff --git a/inc/spec.h b/inc/spec.h
new file mode 100644
index 0000000..7991866
--- /dev/null
+++ b/inc/spec.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2021, Marvin Borner <melvix@marvinborner.de>
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef MARFS_SPEC
+#define MARFS_SPEC
+
+#include <def.h>
+
+#define MARFS_POINT(head, tail) ((struct marfs_pointer){ (head), (tail) })
+#define MARFS_MAGIC "MarFS"
+#define MARFS_SPEC_VERSION 1
+
+#define MARFS_END 0xffffffff
+#define MARFS_NAME_LENGTH 32
+#define MARFS_ENTRY_SIZE 1024
+
+#define MARFS_DIR_ENTRY 1
+#define MARFS_FILE_ENTRY 2;
+
+#define MARFS_DIR_ENTRY_COUNT (MARFS_ENTRY_SIZE / sizeof(struct marfs_dir_entry_data))
+
+struct marfs_pointer {
+ u32 head, tail;
+} PACKED;
+
+struct marfs_header {
+ char magic[6];
+ u32 version;
+ u32 entry_size;
+ struct marfs_pointer main;
+ u8 padding[MARFS_ENTRY_SIZE - 22];
+} PACKED;
+
+struct marfs_entry_header {
+ u32 type;
+ u32 prev, next; // MARFS_END if end
+} PACKED;
+
+struct marfs_dir_entry_data {
+ char name[MARFS_NAME_LENGTH];
+ struct marfs_pointer pointer;
+} PACKED;
+
+struct marfs_dir_entry {
+ struct marfs_entry_header header;
+ struct marfs_dir_entry_data entries[MARFS_DIR_ENTRY_COUNT];
+ u8 padding[MARFS_ENTRY_SIZE - sizeof(struct marfs_entry_header) -
+ (MARFS_DIR_ENTRY_COUNT * sizeof(struct marfs_dir_entry_data))];
+} PACKED;
+
+struct marfs_file_entry {
+ struct marfs_entry_header header;
+ u8 data[MARFS_ENTRY_SIZE - sizeof(struct marfs_entry_header)];
+} PACKED;
+
+#endif
diff --git a/makefile b/makefile
index c05d506..899ffb8 100644
--- a/makefile
+++ b/makefile
@@ -22,16 +22,19 @@ compile: all sync
clean:
@rm -rf $(BUILD)/*
-run: compile $(BUILD) $(BUILD)/disk.img
+clean_disk:
+ @rm -rf $(BUILD)/*.img
+
+run: compile $(BUILD) clean_disk $(BUILD)/disk.img
sync: # Ugly hack
- @$(MAKE) --always-make --dry-run | grep -wE 'gcc' | grep -w '\-c' | jq -nR '[inputs|{directory: match("/marfs/build/[^.]+").string[14:], command: ., file: match(" [^ ]+$$").string[1:]}]' >compile_commands.json &
+ @$(MAKE) --always-make --dry-run | grep -wE 'gcc' | jq -nR '[inputs|{directory: ".", command: ., file: match(" [^ ]+$$").string[1:]}]' >compile_commands.json &
@$(TG) -R --exclude=.git --exclude=build . &
$(BUILD)/%.c.o: %.c
- @$(CC) $(CFLAGS) $< -o $(patsubst $(BUILD)/$(SRC)/%.c.o,$(BUILD)/%,$@)
+ @$(CC) $(CFLAGS) $< -o $(patsubst $(BUILD)/$(SRC)/%.c.o,$(BUILD)/marfs_%,$@)
-.PHONY: all run compile clean sync
+.PHONY: all run compile clean clean_disk sync
$(BUILD):
@mkdir -p $@
@@ -40,6 +43,6 @@ $(BUILD):
@dd if=/dev/zero of=$@ bs=1k count=32k status=none
@DEV=$$($(SU) losetup --find --partscan --show $@) && \
PART="p1" && \
- $(SU) parted -s "$$DEV" mklabel msdos mkpart primary ext2 32k 100% -a minimal set 1 boot on && \
- echo Formatting... && \
+ $(SU) parted -s "$$DEV" mklabel msdos mkpart primary 32k 100% -a minimal set 1 boot on && \
+ $(SU) ./build/marfs_mkfs "$$DEV$$PART" && \
$(SU) losetup -d "$$DEV"
diff --git a/src/create.c b/src/create.c
deleted file mode 100644
index e0653bc..0000000
--- a/src/create.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main(int argc, char *argv[])
-{
- printf("AAH\n");
- return 0;
-}
diff --git a/src/mkfs.c b/src/mkfs.c
new file mode 100644
index 0000000..5d539d0
--- /dev/null
+++ b/src/mkfs.c
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2021, Marvin Borner <melvix@marvinborner.de>
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <spec.h>
+
+#include <assert.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ // Verify that spec is correct
+ assert(sizeof(struct marfs_header) == MARFS_ENTRY_SIZE);
+ assert(sizeof(struct marfs_dir_entry) == MARFS_ENTRY_SIZE);
+ assert(sizeof(struct marfs_file_entry) == MARFS_ENTRY_SIZE);
+
+ if (argc < 2) {
+ fprintf(stderr, "%s: error: no image specified\n", argv[0]);
+ return 1;
+ }
+
+ FILE *image = fopen(argv[1], "r+");
+ if (!image) {
+ fprintf(stderr, "%s: error: no valid image specified\n", argv[0]);
+ return 1;
+ }
+
+ struct marfs_header header = {
+ .magic = MARFS_MAGIC,
+ .version = MARFS_SPEC_VERSION,
+ .entry_size = MARFS_ENTRY_SIZE,
+ .main = MARFS_POINT(1, 1),
+ .padding = { 0 },
+ };
+
+ fseek(image, 0, SEEK_SET);
+ size_t write = fwrite(&header, 1, sizeof(header), image);
+ if (write != sizeof(header))
+ fprintf(stderr, "%s: error: header write failed: %lu bytes written\n", argv[0],
+ write);
+
+ struct marfs_dir_entry main = {
+ .header.type = MARFS_DIR_ENTRY,
+ .header.prev = MARFS_END,
+ .header.next = MARFS_END,
+ };
+ main.entries[0].name[0] = 0;
+
+ write = fwrite(&main, 1, sizeof(main), image);
+ if (write != sizeof(main))
+ fprintf(stderr, "%s: error: main directory write failed: %lu bytes written\n",
+ argv[0], write);
+
+ fflush(image);
+ fclose(image);
+
+ printf("MarFS format successful\n");
+ return 0;
+}