summaryrefslogtreecommitdiffstats
path: root/boot/limine/limine.c
blob: 6a1bb438bde1bebc7cd3747267680990bd02c6f4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "limine.h"
#include "boot.h"
#include "string.h"

char s_kernel_stack_initial[8192];

char *jove_bootargs;
int jove_bootargs_len;

struct limine_kernel_file_request s_kernel_file_req = {
    .id = LIMINE_KERNEL_FILE_REQUEST
};

void
_start(void)
{
    __asm__ volatile("movq %0, %%rsp":: "r"((uintptr_t)&s_kernel_stack_initial + 8191));

    struct limine_kernel_file_response *kernel_file_response = s_kernel_file_req.response;
    jove_bootargs = kernel_file_response->kernel_file->cmdline;
    jove_bootargs_len = strlen(jove_bootargs);

    //Zero all spaces in bootargs not enclosed with quotes.
    for(char *c = jove_bootargs; *c; c++) {
        if(*c == '"') {
            *c = 0;
            for(++c; *c && *c != '"'; c++);
            *(c++) = 0;
            continue;
        }
        if(*c == ' ') *c = 0;
    }

    extern void _jove_main(void);

    __asm__ volatile("movq $0, %%rbp"::);
    _jove_main();
}