Skip to content

Commit 2cab4f7

Browse files
committed
Merge branch 'refactoring'
2 parents b6fbc96 + 8c5adf7 commit 2cab4f7

3 files changed

Lines changed: 48 additions & 24 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ all: libmultiboot.so libmultiboot.so.full libmultiboot.a libmultiboot_p.a
1111
.PHONY: clean
1212
clean:
1313
rm -f libmultiboot.a
14+
rm -f libmultiboot_p.a
1415
rm -f libmultiboot.so
1516
rm -f libmultiboot.so.full
1617
rm -f ${OBJS}

loader.c

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,16 @@ size_t highmem = 0;
1717

1818
jmp_buf jb;
1919

20-
void
21-
loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
20+
struct args loader_args = {
21+
.kernel_filename = NULL
22+
};
23+
24+
uint32_t
25+
parse_args(struct args* args)
2226
{
2327
const char *var, *delim, *value;
24-
void *kernfile = NULL;
25-
int mode = 0, uid = 0, gid = 0;
26-
27-
size_t kernsz = 0, resid = 0;
28-
void *kernel = NULL;
29-
struct multiboot *mb = NULL;
3028
int i = 0;
3129

32-
if (version < USERBOOT_VERSION)
33-
abort();
34-
35-
callbacks = cb;
36-
callbacks_arg = arg;
37-
38-
/* setjmp error anchor */
39-
if (setjmp(jb))
40-
return;
41-
4230
/* iterate over environment */
4331
while ( (var = CALLBACK(getenv, i++)) ) {
4432
delim = strchr(var, '=');
@@ -54,16 +42,45 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
5442
if (!strncmp(var, "kernel", delim-var)) {
5543
if (!value) {
5644
ERROR(EINVAL,"no kernel filename provided");
57-
goto error;
45+
return EINVAL;
5846
}
5947

60-
if (callbacks->open(callbacks_arg, value, &kernfile)) {
61-
ERROR(errno, "could not open kernel");
62-
goto error;
63-
}
48+
args->kernel_filename = value;
6449
}
6550
}
6651

52+
return 0;
53+
}
54+
55+
void
56+
loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
57+
{
58+
void *kernfile = NULL;
59+
int mode = 0, uid = 0, gid = 0;
60+
61+
size_t kernsz = 0, resid = 0;
62+
void *kernel = NULL;
63+
struct multiboot *mb = NULL;
64+
65+
if (version < USERBOOT_VERSION)
66+
abort();
67+
68+
callbacks = cb;
69+
callbacks_arg = arg;
70+
71+
/* setjmp error anchor */
72+
if (setjmp(jb))
73+
return;
74+
75+
if (parse_args(&loader_args))
76+
goto error;
77+
78+
if (callbacks->open(callbacks_arg, loader_args.kernel_filename, &kernfile))
79+
{
80+
ERROR(errno, "could not open kernel");
81+
goto error;
82+
}
83+
6784
/* Get the memory layout */
6885
callbacks->getmem(callbacks_arg, &lowmem, &highmem);
6986
printf("lowmem = %lu, highmem = %lu\r\n", lowmem, highmem);
@@ -90,7 +107,7 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
90107
goto error;
91108
}
92109

93-
/* Check that a kernel file was provided */
110+
/* Scan for the multiboot header */
94111
if (!(mb = mb_scan(kernel, kernsz))) {
95112
ERROR(EINVAL, "No multiboot header found.");
96113
goto error;

loader.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ extern void *callbacks_arg;
4949
*/
5050
extern jmp_buf jb;
5151

52+
struct args {
53+
const char* kernel_filename;
54+
};
55+
56+
extern struct loader_args args;
57+
5258
#define ERROR(err, str) do { \
5359
errno = err; \
5460
perror(str); \

0 commit comments

Comments
 (0)