Skip to content

Commit 4bccbdd

Browse files
committed
Add support for setting initial ramdisk
1 parent 504ab80 commit 4bccbdd

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

src/kernel.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,31 @@ void *kernel_load(struct vm *vm, char *path) {
6868
kernel_size = image_size - offset_kernel;
6969

7070
memcpy(ram_addr + 0x100000, mem + offset_kernel, kernel_size);
71+
72+
// load initramfs
73+
if (vm->initramfs != NULL) {
74+
int fd_initram = open(vm->initramfs, O_RDWR);
75+
if (fd_initram < -1)
76+
err(1, "open initramfs image failed");
77+
78+
struct stat statbuf;
79+
fstat(fd_initram, &statbuf);
80+
size_t initram_size = statbuf.st_size;
81+
82+
uint8_t *init_memory = mmap(NULL, initram_size, PROT_READ | PROT_WRITE,
83+
MAP_SHARED, fd_initram, 0);
84+
if (init_memory == MAP_FAILED)
85+
errx(1, "initramfs: failed loading image");
86+
87+
memcpy(ram_addr + kernel_size + 0x100000, init_memory, statbuf.st_size);
88+
struct boot_params *initramfs_boot_param =
89+
(struct boot_params *)(ram_addr + 0x6000 + 0x10000);
90+
struct setup_header *setup_header = &(initramfs_boot_param->hdr);
91+
92+
setup_header->ramdisk_image = (uint64_t)(kernel_size + 0x100000);
93+
setup_header->ramdisk_size = statbuf.st_size;
94+
}
95+
7196
return ram_addr;
7297
}
7398

src/vm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct vm {
1313
size_t ram_size;
1414
struct kvm_run *run;
1515
struct kvm_sregs sregs;
16+
char *initramfs;
1617
};
1718

1819
int vm_create(struct vm *v);

src/wiser.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ static struct argp_option options[] = {
3434
{"memory", 'r', 0, 0, "Ram size for your vm"},
3535
{"vcpu", 'c', 0, 0, "Number of cpu for your vm"},
3636
{"image", 'i', "IMAGE", 0, "linux kernel bzimage"},
37+
{"initramfs", 'z', "PATH", 0, "load initial ram disk"},
3738
{0}};
3839

3940
/* Used by main to communicate with parse_opt. */
4041
struct arguments {
4142
int verbose, memory, vcpu;
4243
char *image_file;
44+
char *initrd_file;
4345
};
4446

4547
/* Parse a single option. */
@@ -55,6 +57,9 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
5557
case 'i':
5658
arguments->image_file = arg;
5759
break;
60+
case 'z':
61+
arguments->initrd_file = arg;
62+
break;
5863
case 'c':
5964
arguments->vcpu = atoi(arg); /* TODO */
6065
case 'r':
@@ -80,6 +85,9 @@ int main(int argc, char **argv) {
8085
int ret;
8186
struct vm core_vm;
8287

88+
if (arguments.initrd_file != NULL)
89+
core_vm.initramfs = arguments.initrd_file;
90+
8391
ret = vm_create(&core_vm);
8492
ERROR(ret)
8593
ret = vm_init(&core_vm);

0 commit comments

Comments
 (0)