アットウィキロゴ

load_command_line

名称

load_command_line - linux 起動用コマンドライン文字列の設定

書式

int
load_command_line(
    mic_ctx_t * mic_ctx,
    uint64_t    uos_cmd_offset,
    uint32_t    initramfs_image,
    uint32_t    initramfs_size);

引数

mic_ctx
設定するカードの context
uos_cmd_offset
文字列格納領域の aperture 内オフセット
initramfs_image
ramfs イメージのカード内物理アドレス
initramfs_size
ramfs イメージのサイズ

説明

引数 mic_ctx が示すカード上の、引数 uos_cmd_offset が示す領域に、linux 用の kernel boot command line 文字列を設定する。
設定した文字列のコピーを kmalloc(GFP_KERNEL) で確保した領域に格納し、mic_ctx の sysfs_info の kernel_cmdline からポイントさせる。
この kmalloc に失敗しても処理は成功する。この場合、kernel_cmdline は NULL となる。
kernel_cmdline がすでに領域をポイントしている場合は、古い領域を kfree で解放する。

文字列作成用のワーク領域を確保できない場合、メッセージ "failed to allocate <ワーク領域サイズ> bytes for uOS comand line" を出力して、-ENOMEM エラー終了する。

command line 文字列として、以下のものを作成する。
card=%d mic_ctx->bi_id
vnet=%s "poll" mic_vnet_mode==VNET_MODE_POLL
vnet=%s "intr" mic_vnet_mode==VNET_MODE_INTR
vnet=%s "dma" mic_vnet_mode==VNET_MODE_DMA
scif_id=%d mic_ctx->bi_id+1
scif_addr=0x%llx mic_ctx->bi_scif.si_pa
vnet_addr=0x%llx mic_ctx->bd_info->bi_vethinfo->vi_rp_phys mic_vnet_mode==VNET_MODE_DMA
memmap=%dM$0x%08x initramfs_size, initramfs_image initramfs_image!=NULL
rdinit=%s "/init" initramfs_image!=NULL
initrd=0x%08x,%dM initramfs_image, initramfs_size initramfs_image!=NULL
vcons_hdr_addr=0x%llx vcons->dc_hdr_dma_addr #ifdef USE_VCONSOLE
mic_ctx->bi_vcons->dc_enabled
vcons_hdr_addr=0x%llx 0 #ifdef USE_VCONSOLE
!mic_ctx->bi_vcons->dc_enabled
virtio_addr=0x%llx mic_ctx->bd_info->bi_virtio?
mem=%dM mic_ctx->boot_mem
ramoops_size=%d mic_ctx->ramoops_size mic_ctx->ramoops_size!=0
ramoops_addr=0x%llx mic_ctx->ramoops_pa[0] mic_ctx->ramoops_size!=0
p2p=%d mic_p2p_enable
etc_comp=%lld mic_ctx->etc_comp
reg_cache=%d mic_reg_cache_enable
huge_page=%d mic_huge_page_enable
%s mic_ctx->sysfs_info.cmdline mic_ctx->sysfs_info.cmdline!=NULL
hostname=mic%d mic_ctx->bi_id mic_ctx->sysfs_info.cmdline==NULL
ipaddr=171.31.%d.2 mic_ctx->bi_id+1 mic_ctx->sysfs_info.cmdline==NULL
quiet mic_ctx->sysfs_info.cmdline==NULL
console=%s "ttyS0,115200n8" mic_ctx->sysfs_info.cmdline==NULL

戻り値

処理に成功した場合、0 を返す。
そうでない場合、0 以外の値を返す。

-ENOMEM
ワークメモリを確保できない場合

参照


実装

host/driver/uos_download.c
555 int
556 load_command_line(mic_ctx_t *mic_ctx, uint64_t uos_cmd_offset, uint32_t initramfs_image, uint32_t in     itramfs_size)
557 {
558         void *cmd_line_va = mic_ctx->aper.va + uos_cmd_offset;
559         uint32_t cmdlen = 0;
560         char *buf = NULL;
561         struct board_info *bi = mic_ctx->bd_info;
562
563 #ifdef USE_VCONSOLE
564         micvcons_t *vcons = &mic_ctx->bi_vcons;
565         dma_addr_t vc_hdr_dma_addr = 0;
566 #endif
567
568         /*
569          * mic_ctx->boot_mem will also be set in IOCTL to boot the card in restricted memory
570          * FIXME::This code is added to keep the backward compatibility with IOCTLs
571          */
572         if (mic_ctx->bi_family == FAMILY_KNC)
573                 if (mic_ctx->boot_mem == 0 || mic_ctx->boot_mem > mic_ctx->aper.len >> 20)
574                         mic_ctx->boot_mem = mic_ctx->aper.len >> 20;
575         if (!(buf = kzalloc(MIC_CMDLINE_BUFSIZE, GFP_KERNEL))) {
576                 printk(KERN_ERR "failed to allocate %d bytes for uOS command line\n",
577                             MIC_CMDLINE_BUFSIZE);
578                 return -ENOMEM;
579         }
580
581         cmdlen = snprintf(buf, MIC_CMDLINE_BUFSIZE, "card=%d vnet=%s scif_id=%d scif_addr=0x%llx",
582                                 mic_ctx->bi_id, mic_vnet_modes[mic_vnet_mode],
583                                 mic_ctx->bi_id + 1, mic_ctx->bi_scif.si_pa);
584
585         if (mic_vnet_mode == VNET_MODE_DMA) {
586                 struct micvnet_info *vnet_info = bi->bi_vethinfo;
587                 cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
588                         " vnet_addr=0x%llx", vnet_info->vi_rp_phys);
589         }
590
591         if (initramfs_image) {
592                 cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
593                          " memmap=%dM$0x%08x rdinit=/init initrd=0x%08x,%dM ",
594                          initramfs_size, initramfs_image, initramfs_image, initramfs_size);
595         }
596
597 #ifdef USE_VCONSOLE
598         if (vcons->dc_enabled)
599                 vc_hdr_dma_addr = vcons->dc_hdr_dma_addr;
600
601         cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
602                 " vcons_hdr_addr=0x%llx", vc_hdr_dma_addr);
603 #endif
604
605 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) || defined(__GNUC_RH_RELEASE__)
606         cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen, " virtio_addr=0x%llx",
607                                 mic_ctx_map_single(mic_ctx, bi->bi_virtio, sizeof(struct vb_shared))     );
608 #endif
609
610         if (mic_ctx->boot_mem)
611                 cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
612                                          " mem=%dM", mic_ctx->boot_mem);
613         mic_ctx->boot_mem = 0;
614
615         if (mic_ctx->ramoops_size)
616                 cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
617                         " ramoops_size=%d ramoops_addr=0x%llx",
618                         mic_ctx->ramoops_size, mic_ctx->ramoops_pa[0]);
619
620         cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen, " p2p=%d", mic_p2p_enable);
621
622         if (mic_ctx->bi_family == FAMILY_KNC)
623                 cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
624                         " etc_comp=%lld", mic_ctx->etc_comp);
625         cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
626                 " reg_cache=%d", mic_reg_cache_enable);
627         cmdlen += snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
628                 " huge_page=%d", mic_huge_page_enable);
629         if (mic_ctx->sysfs_info.cmdline != NULL)
630                 snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
631                                " %s", mic_ctx->sysfs_info.cmdline);
632         else
633                 snprintf(buf + cmdlen, MIC_CMDLINE_BUFSIZE - cmdlen,
634                                " hostname=mic%d ipaddr=171.31.%d.2 quiet console=ttyS0,115200n8",
635                                mic_ctx->bi_id, mic_ctx->bi_id + 1);
636
637         memcpy_toio(cmd_line_va, buf, strlen(buf) + 1);
638
639         if (mic_ctx->sysfs_info.kernel_cmdline != NULL)
640                 kfree(mic_ctx->sysfs_info.kernel_cmdline);
641
642         if ((mic_ctx->sysfs_info.kernel_cmdline = kmalloc(strlen(buf) + 1, GFP_KERNEL)) != NULL)
643                 strcpy(mic_ctx->sysfs_info.kernel_cmdline, buf);
644
645         kfree(buf);
646         return 0;
647 }
最終更新:2012年11月18日 15:30