CPUがリセットされると呼び出されるdo_cpu_reset関数では、
set_kernel_args関数を次のような引数で呼び出しています。
set_kernel_args関数を次のような引数で呼び出しています。
200 set_kernel_args(info, info->initrd_size, 201 info->loader_start);
set_kernel_args関数は、hw/arm_boot.cで次のように定義されています。
各種パラメータをWRITE_WORDで設定しています。
各種パラメータをWRITE_WORDで設定しています。
56 static void set_kernel_args(const struct arm_boot_info *info, 57 int initrd_size, target_phys_addr_t base) 58 { 59 target_phys_addr_t p; 60 61 p = base + KERNEL_ARGS_ADDR; 62 /* ATAG_CORE */ 63 WRITE_WORD(p, 5); 64 WRITE_WORD(p, 0x54410001); 65 WRITE_WORD(p, 1); 66 WRITE_WORD(p, 0x1000); 67 WRITE_WORD(p, 0); 68 /* ATAG_MEM */ 69 /* TODO: handle multiple chips on one ATAG list */ 70 WRITE_WORD(p, 4); 71 WRITE_WORD(p, 0x54410002); 72 WRITE_WORD(p, info->ram_size); 73 WRITE_WORD(p, info->loader_start); 74 if (initrd_size) { 75 /* ATAG_INITRD2 */ 76 WRITE_WORD(p, 4); 77 WRITE_WORD(p, 0x54420005); 78 WRITE_WORD(p, info->loader_start + INITRD_LOAD_ADDR); 79 WRITE_WORD(p, initrd_size); 80 } 81 if (info->kernel_cmdline && *info->kernel_cmdline) { 82 /* ATAG_CMDLINE */ 83 int cmdline_size; 84 85 cmdline_size = strlen(info->kernel_cmdline); 86 cpu_physical_memory_write(p + 8, (void *)info->kernel_cmdline, 87 cmdline_size + 1); 88 cmdline_size = (cmdline_size >> 2) + 1; 89 WRITE_WORD(p, cmdline_size + 2); 90 WRITE_WORD(p, 0x54410009); 91 p += cmdline_size * 4; 92 } 93 if (info->atag_board) { 94 /* ATAG_BOARD */ 95 int atag_board_len; 96 uint8_t atag_board_buf[0x1000]; 97 98 atag_board_len = (info->atag_board(info, atag_board_buf) + 3) & ~3; 99 WRITE_WORD(p, (atag_board_len + 8) >> 2); 100 WRITE_WORD(p, 0x414f4d50); 101 cpu_physical_memory_write(p, atag_board_buf, atag_board_len); 102 p += atag_board_len; 103 } 104 /* ATAG_END */ 105 WRITE_WORD(p, 0); 106 WRITE_WORD(p, 0); 107 }
検証、Verification、FPGA