summaryrefslogtreecommitdiff
path: root/src/user/bootstrap
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/bootstrap')
-rw-r--r--src/user/bootstrap/entry.S27
-rw-r--r--src/user/bootstrap/linker.ld31
-rw-r--r--src/user/bootstrap/main.c43
-rw-r--r--src/user/bootstrap/tar.c155
-rw-r--r--src/user/bootstrap/tar.h6
5 files changed, 0 insertions, 262 deletions
diff --git a/src/user/bootstrap/entry.S b/src/user/bootstrap/entry.S
deleted file mode 100644
index bd1b417..0000000
--- a/src/user/bootstrap/entry.S
+++ /dev/null
@@ -1,27 +0,0 @@
-#define ASM_FILE 1
-#include <camellia/syscalls.h>
-#include <camellia/flags.h>
-
-.set STACK_TOP, 0xFFFFFFFFFFFFFFFF
-.set STACK_PAGES, 4
-
-.section .text.startup
-.global _start
-.type _start, @function
-_start:
- mov $_SYS_MEMFLAG, %rdi
- mov $(STACK_TOP & ~0xFFF - (STACK_PAGES - 1) * 0x1000), %rsi
- mov $(STACK_PAGES * 0x1000), %rdx
- mov $MEMFLAG_PRESENT, %r10
- syscall
-
- mov $_SYS_MEMFLAG, %rdi
- mov $_bss_start, %rsi
- mov $_bss_end, %rdx
- sub $_bss_start, %rdx
- mov $MEMFLAG_PRESENT, %r10
- mov %rsp, %r8
- syscall
-
- mov $(STACK_TOP & ~0xF), %rsp
- call main // and don't you dare return
diff --git a/src/user/bootstrap/linker.ld b/src/user/bootstrap/linker.ld
deleted file mode 100644
index 10e3f98..0000000
--- a/src/user/bootstrap/linker.ld
+++ /dev/null
@@ -1,31 +0,0 @@
-ENTRY(_start)
-
-SECTIONS
-{
- . = 0x20000;
- _bss_start = .;
- .bss BLOCK(4K) : ALIGN(4K)
- {
- *(COMMON)
- *(.bss)
- }
- _bss_end = .;
-
- . = 2M;
- .text BLOCK(4K) : ALIGN(4K)
- {
- /* the assert needs to be inside of a section or it'll be a syntax error */
- ASSERT(_bss_end <= 2M, "bss too big, needs to be moved down");
- *(.text.startup)
- *(.text)
- }
- .rodata BLOCK(4K) : ALIGN(4K)
- {
- *(.rodata)
- }
- .data BLOCK(4K) : ALIGN(4K)
- {
- *(.data*)
- }
- _initrd = .; /* is just appended onto the end of the binary */
-}
diff --git a/src/user/bootstrap/main.c b/src/user/bootstrap/main.c
deleted file mode 100644
index d27da39..0000000
--- a/src/user/bootstrap/main.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <_proc.h>
-#include <camellia/flags.h>
-#include <camellia/syscalls.h>
-#include <stdio.h>
-#include <string.h>
-#include <elfload.h>
-#include <camellia/fs/misc.h>
-
-#include "tar.h"
-
-extern char _bss_start;
-extern char _bss_end;
-extern char _initrd;
-
-__attribute__((section(".text")))
-int main(void) {
- _sys_memflag(_psdata_loc, 1, MEMFLAG_PRESENT);
- setprogname("bootstrap");
-
- _sys_mount(HANDLE_PROCFS, "/proc/", strlen("/proc/"));
- MOUNT_AT("/") {
- fs_dirinject2((const char*[]) {
- "/proc/",
- "/init/",
- NULL
- });
- }
- MOUNT_AT("/init/") {
- tar_driver(&_initrd);
- }
-
- const char *initpath = "bin/amd64/init";
- char *initargv[] = {"init", NULL};
- void *init = tar_find(initpath, strlen(initpath), &_initrd, ~0) + 512;
- if (init) {
- _klogf("execing init");
- elf_exec(init, initargv, NULL);
- _klogf("elf_exec failed");
- } else {
- _klogf("couldn't find init.elf");
- }
- _sys_exit(1);
-}
diff --git a/src/user/bootstrap/tar.c b/src/user/bootstrap/tar.c
deleted file mode 100644
index 2020fe0..0000000
--- a/src/user/bootstrap/tar.c
+++ /dev/null
@@ -1,155 +0,0 @@
-#include "tar.h"
-#include <camellia/flags.h>
-#include <camellia/fsutil.h>
-#include <camellia/syscalls.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <camellia/compat.h>
-#include <camellia/fs/dir.h>
-
-#define BUF_SIZE 64
-
-static void *tar_open(const char *path, int len, void *base, size_t base_len);
-static char tar_type(void *meta);
-static void tar_dirbuild(struct dirbuild *db, const char *meta, void *base, size_t base_len);
-static void tar_read(struct ufs_request *res, void *base, size_t base_len);
-static int tar_size(void *sector);
-static int oct_parse(char *str, size_t len);
-
-
-static const char *root_fakemeta = ""; /* see comment in tar_open */
-
-
-void tar_driver(void *base) {
- static char buf[BUF_SIZE];
- struct ufs_request res;
- void *ptr;
- while (!c0_fs_wait(buf, BUF_SIZE, &res)) {
- switch (res.op) {
- case VFSOP_OPEN:
- ptr = tar_open(buf, res.len, base, ~0);
- c0_fs_respond(ptr, ptr ? 0 : -1, 0);
- break;
-
- case VFSOP_READ:
- tar_read(&res, base, ~0);
- break;
-
- case VFSOP_GETSIZE:
- if (tar_type(res.id) != '5') {
- c0_fs_respond(NULL, tar_size(res.id), 0);
- } else {
- struct dirbuild db;
- dir_start(&db, res.offset, NULL, 0);
- tar_dirbuild(&db, res.id, base, ~0);
- c0_fs_respond(NULL, dir_finish(&db), 0);
- }
- break;
-
- default:
- c0_fs_respond(NULL, -1, 0); // unsupported
- break;
- }
- }
- exit(0);
-}
-
-static char tar_type(void *meta) {
- if (meta == root_fakemeta) return '5';
- return *(char*)(meta + 156);
-}
-
-static void *tar_open(const char *path, int len, void *base, size_t base_len) {
- if (len <= 0) return NULL;
- path += 1; // skip the leading slash
- len -= 1;
-
- /* TAR archives don't (seem to) contain an entry for the root dir, so i'm
- * returning a fake one. this isn't a full entry because i'm currently too
- * lazy to create a full one - thus, it has to be special cased in tar_read */
- if (len == 0)
- return (void*)root_fakemeta;
-
- return tar_find(path, len, base, base_len);
-}
-
-static void tar_dirbuild(struct dirbuild *db, const char *meta, void *base, size_t base_len) {
- size_t meta_len = strlen(meta);
- for (size_t off = 0; off < base_len;) {
- if (0 != memcmp(base + off + 257, "ustar", 5))
- break; // not a metadata sector
-
- /* check if prefix matches */
- if (0 == memcmp(base + off, meta, meta_len)
- && *(char*)(base + off + meta_len) != '\0') {
- char *suffix = base + off + meta_len;
-
- /* check if the path contains any non-trailing slashes */
- char *slash = strchr(suffix, '/');
- if (!slash || slash[1] == '\0') {
- if (dir_append(db, suffix)) break;
- }
- }
-
- int size = tar_size(base + off);
- off += 512; // skip this metadata sector
- off += (size + 511) & ~511; // skip the data sectors
- }
-}
-
-static void tar_read(struct ufs_request *res, void *base, size_t base_len) {
- void *meta = (void*)res->id;
- static char buf[BUF_SIZE];
- // TODO reuse a single buffer for both tar_driver and tar_read
-
- switch (tar_type(meta)) {
- case '\0':
- case '0': /* normal files */
- fs_normslice(&res->offset, &res->len, tar_size(meta), false);
- c0_fs_respond(meta + 512 + res->offset, res->len, 0);
- break;
-
- case '5': /* directory */
- struct dirbuild db;
- dir_start(&db, res->offset, buf, sizeof buf);
- tar_dirbuild(&db, meta, base, base_len);
- c0_fs_respond(buf, dir_finish(&db), 0);
- break;
-
- default:
- c0_fs_respond(NULL, -1, 0);
- break;
- }
-}
-
-static int tar_size(void *sector) {
- return oct_parse(sector + 124, 11);
-}
-
-void *tar_find(const char *path, size_t path_len, void *base, size_t base_len) {
- int size;
- if (path_len > 100) return NULL; // illegal path
-
- for (size_t off = 0; off < base_len;) {
- if (0 != memcmp(base + off + 257, "ustar", 5))
- break; // not a metadata sector
- if (0 == memcmp(base + off, path, path_len) &&
- *(char*)(base + off + path_len) == '\0')
- return base + off; // file found, quit
-
- size = tar_size(base + off);
- off += 512; // skip this metadata sector
- off += (size + 511) & ~511; // skip the data sectors
- }
- return NULL;
-}
-
-static int oct_parse(char *str, size_t len) {
- int res = 0;
- for (size_t i = 0; i < len; i++) {
- res *= 8;
- res += str[i] - '0'; // no format checking
- }
- return res;
-}
diff --git a/src/user/bootstrap/tar.h b/src/user/bootstrap/tar.h
deleted file mode 100644
index e7ab130..0000000
--- a/src/user/bootstrap/tar.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-#include <camellia/types.h>
-#include <stddef.h>
-
-_Noreturn void tar_driver(void *base);
-void *tar_find(const char *path, size_t path_len, void *base, size_t base_len);