diff options
author | Marvin Borner | 2021-12-30 17:23:51 +0100 |
---|---|---|
committer | Marvin Borner | 2021-12-30 17:23:51 +0100 |
commit | 028755c57007c3241e287b9927c6810814eecde1 (patch) | |
tree | c4c5a8826390f651f975425f96e275395db43c19 | |
parent | 6236c3d88ccba4429cbb4020ea0ed02816282451 (diff) |
Makemake crakecrake
-rw-r--r-- | inc/def.h | 65 | ||||
-rw-r--r-- | inc/spec.h | 58 | ||||
-rw-r--r-- | makefile | 15 | ||||
-rw-r--r-- | src/create.c | 7 | ||||
-rw-r--r-- | src/mkfs.c | 60 |
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 @@ -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; +} |