MCPcopy Index your code
hub / github.com/copy/v86 / load_kernel

Function load_kernel

src/kernel.js:40–177  ·  view source on GitHub ↗
(mem8, bzimage, initrd, cmdline)

Source from the content-addressed store, hash-verified

38
39
40function load_kernel(mem8, bzimage, initrd, cmdline)
41{
42 dbg_log("Trying to load kernel of size " + bzimage.byteLength);
43
44 const KERNEL_HIGH_ADDRESS = 0x100000;
45
46 // Put the initrd at the 64 MB boundary. This means the minimum memory size
47 // is 64 MB plus the size of the initrd.
48 // Note: If set too low, kernel may fail to load the initrd with "invalid magic at start of compressed archive"
49 const INITRD_ADDRESS = 64 << 20;
50
51 const quiet = false;
52
53 const bzimage8 = new Uint8Array(bzimage);
54 const bzimage16 = new Uint16Array(bzimage);
55 const bzimage32 = new Uint32Array(bzimage);
56
57 const setup_sects = bzimage8[LINUX_BOOT_HDR_SETUP_SECTS] || 4;
58 const syssize = bzimage32[LINUX_BOOT_HDR_SYSSIZE >> 2] << 4;
59
60 const vidmode = bzimage16[LINUX_BOOT_HDR_VIDMODE >> 1];
61
62 const checksum1 = bzimage16[LINUX_BOOT_HDR_BOOT_FLAG >> 1];
63 if(checksum1 !== LINUX_BOOT_HDR_CHECKSUM1)
64 {
65 dbg_log("Bad checksum1: " + h(checksum1));
66 return;
67 }
68
69 // Not aligned, so split into two 16-bit reads
70 const checksum2 =
71 bzimage16[LINUX_BOOT_HDR_HEADER >> 1] |
72 bzimage16[LINUX_BOOT_HDR_HEADER + 2 >> 1] << 16;
73 if(checksum2 !== LINUX_BOOT_HDR_CHECKSUM2)
74 {
75 dbg_log("Bad checksum2: " + h(checksum2));
76 return;
77 }
78
79 const protocol = bzimage16[LINUX_BOOT_HDR_VERSION >> 1];
80 dbg_assert(protocol >= 0x202); // older not supported by us
81
82 const flags = bzimage8[LINUX_BOOT_HDR_LOADFLAGS];
83 dbg_assert(flags & LINUX_BOOT_HDR_LOADFLAGS_LOADED_HIGH); // low kernels not supported by us
84
85 // we don't relocate the kernel, so we don't care much about most of these
86
87 const flags2 = bzimage16[LINUX_BOOT_HDR_XLOADFLAGS >> 1];
88 const initrd_addr_max = bzimage32[LINUX_BOOT_HDR_INITRD_ADDR_MAX >> 2];
89 const kernel_alignment = bzimage32[LINUX_BOOT_HDR_KERNEL_ALIGNMENT >> 2];
90 const relocatable_kernel = bzimage8[LINUX_BOOT_HDR_RELOCATABLE_KERNEL];
91 const min_alignment = bzimage8[LINUX_BOOT_HDR_MIN_ALIGNMENT];
92 const cmdline_size = protocol >= 0x206 ? bzimage32[LINUX_BOOT_HDR_CMDLINE_SIZE >> 2] : 255;
93 const payload_offset = bzimage32[LINUX_BOOT_HDR_PAYLOAD_OFFSET >> 2];
94 const payload_length = bzimage32[LINUX_BOOT_HDR_PAYLOAD_LENGTH >> 2];
95 const pref_address = bzimage32[LINUX_BOOT_HDR_PREF_ADDRESS >> 2];
96 const pref_address_high = bzimage32[LINUX_BOOT_HDR_PREF_ADDRESS + 4 >> 2];
97 const init_size = bzimage32[LINUX_BOOT_HDR_INIT_SIZE >> 2];

Callers 1

cpu.jsFile · 0.85

Calls 3

hFunction · 0.85
dbg_assertFunction · 0.85
make_linux_boot_romFunction · 0.85

Tested by

no test coverage detected