Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Zynqのqemu (その9)



CPUがリセットされると呼び出されるdo_cpu_reset関数では、
set_kernel_args関数を次のような引数で呼び出しています。
 200                     set_kernel_args(info, info->initrd_size,
 201                                     info->loader_start);

set_kernel_args関数は、hw/arm_boot.cで次のように定義されています。
各種パラメータを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