(mem8, bzimage, initrd, cmdline)
| 38 | |
| 39 | |
| 40 | function 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]; |
no test coverage detected