国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

uefi+arm64+acpi 組合時boot_command_line的獲取

2019-11-09 16:16:57
字體:
來源:轉載
供稿:網友
在efi_entry 中會通過下面的code從uefi中拿到cmdline    cmdline_ptr = efi_convert_cmdline(sys_table, image, &cmdline_size);    if (!cmdline_ptr) {        PR_efi_err(sys_table, "getting command line via LOADED_IMAGE_PROTOCOL/n");        goto fail;    }char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,              efi_loaded_image_t *image,              int *cmd_line_len){    const u16 *s2;    u8 *s1 = NULL;    unsigned long cmdline_addr = 0;    int load_options_chars = image->load_options_size / 2; /* UTF-16 */    const u16 *options = image->load_options;    int options_bytes = 0;  /* UTF-8 bytes */    int options_chars = 0;  /* UTF-16 chars */    efi_status_t status;    u16 zero = 0;    if (options) {        s2 = options;        while (*s2 && *s2 != '/n'               && options_chars < load_options_chars) {            options_bytes += efi_utf8_bytes(*s2++);            options_chars++;        }    }    if (!options_chars) {        /* No command line options, so return empty string*/        options = &zero;    }    options_bytes++;    /* NUL termination */    status = efi_high_alloc(sys_table_arg, options_bytes, 0,                &cmdline_addr, MAX_CMDLINE_ADDRESS);    if (status != EFI_SUCCESS)        return NULL;    s1 = (u8 *)cmdline_addr;    s2 = (const u16 *)options;    s1 = efi_utf16_to_utf8(s1, s2, options_chars);    *s1 = '/0';    *cmd_line_len = options_bytes;    return (char *)cmdline_addr;}在efi_convert_cmdline 的image代表loaded image的protoc    status = sys_table->boottime->handle_protocol(handle,                    &loaded_image_proto, (void *)&image);然后在efi_convert_cmdline中首先image->load_options 拿到cmdline,然后將cmdline從utf16轉成utf8返回。然后會在allocate_new_fdt_and_exit_boot -> update_fdt中將cmdline_ptr中的內容copy到chosen中efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,            unsigned long orig_fdt_size,            void *fdt, int new_fdt_size, char *cmdline_ptr,            u64 initrd_addr, u64 initrd_size,            efi_memory_desc_t *memory_map,            unsigned long map_size, unsigned long desc_size,            u32 desc_ver){    num_rsv = fdt_num_mem_rsv(fdt);    while (num_rsv-- > 0)        fdt_del_mem_rsv(fdt, num_rsv);    node = fdt_subnode_offset(fdt, 0, "chosen");    if (node < 0) {        node = fdt_add_subnode(fdt, 0, "chosen");        if (node < 0) {            status = node; /* node is error code when negative */            goto fdt_set_fail;        }    }    if ((cmdline_ptr != NULL) && (strlen(cmdline_ptr) > 0)) {        status = fdt_setprop(fdt, node, "bootargs", cmdline_ptr,                     strlen(cmdline_ptr) + 1);        if (status)            goto fdt_set_fail;    }}在update_fdt中可以看到是通過fdt_setprop 將cmdline_ptr 中的內容copy到chosen節點中的bootargs中.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 承德县| 丰原市| 固镇县| 赤城县| 常山县| 望奎县| 东山县| 宣汉县| 青海省| 民乐县| 沈阳市| 澜沧| 聊城市| 台南市| 巨野县| 如皋市| 福州市| 雅安市| 胶州市| 文安县| 廉江市| 修武县| 林甸县| 长阳| 玉树县| 嵩明县| 大渡口区| 衢州市| 南漳县| 潮州市| 定安县| 三台县| 钟祥市| 宿迁市| 河北区| 延长县| 盐山县| 肇东市| 德格县| 澄江县| 武乡县|