高通uefi的abl增加新的kernel cmdlin标签经验分享"/>
高通uefi的abl增加新的kernel cmdlin标签经验分享
高通uefi的abl增加新的kernel cmdlin标签经验分享
a、在此先介绍一下abl中拉起bootimage的流程:
代码路径:
bootloader/edk2/QcomModulePkg/Application/LinuxLoader/LinuxLoader.c
函数头部:
/**Linux Loader Application EntryPoint@param[in] ImageHandle The firmware allocated handle for the EFI image.@param[in] SystemTable A pointer to the EFI System Table.@retval EFI_SUCCESS The entry point is executed successfully.@retval other Some error occurs when executing this entry point.**/EFI_STATUS EFIAPI __attribute__ ( (no_sanitize ("safe-stack")))
LinuxLoaderEntry (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
这个函数主要是在加载bootimage和dtbimage及加载之前做一些检查,例如a/b分区检查,重启原因检查,是否有开机按键事件等,具体代码我就不一介绍,只介绍下这小段:
if (!BootIntoFastboot) {BootInfo Info = {0};Info.MultiSlotBoot = MultiSlotBoot;Info.BootIntoRecovery = BootIntoRecovery;Info.BootReasonAlarm = BootReasonAlarm;Status = LoadImageAndAuth (&Info);if (Status != EFI_SUCCESS) {DEBUG ((EFI_D_ERROR, "LoadImageAndAuth failed: %r\n", Status));goto fastboot;}BootLinux (&Info);}
其中最后的BootLinux 就是加载bootimage的函数,函数的声明代码路径:
bootloader/edk2/QcomModulePkg/Library/BootLib/BootLinux.c
函数头部:
EFI_STATUS BootLinux (BootInfo *Info)
这个函数主要是做一些镜像检查,还有dtb的选择,但我这里只介绍这段:
Status = UpdateCmdLine (BootParamlistPtr.CmdLine, FfbmStr, Recovery,AlarmBoot, Info->VBCmdLine, &BootParamlistPtr.FinalCmdLine);if (EFI_ERROR (Status)) {DEBUG ((EFI_D_ERROR, "Error updating cmdline. Device Error %r\n", Status));return Status;}
函数名就简白,就是更新cmdline的,函数声明代码路径:
/*Update command line: appends boot information to the original commandline*that is taken from boot image header*/
EFI_STATUS
UpdateCmdLine (CONST CHAR8 *CmdLine,CHAR8 *FfbmStr,BOOLEAN Recovery,BOOLEAN AlarmBoot,CONST CHAR8 *VBCmdLine,CHAR8 **FinalCmdLine)
{
这个函数没什么介绍的了,看到函数后面这个,就是真正更新cmdlind的函数:
Status = UpdateCmdLineParams (&Param, FinalCmdLine);if (Status != EFI_SUCCESS) {return Status;}
当然由于传参都是指针,顾名思义这里也是将自己的字段加上cmdline指针上,但实际加载我们不需要理解,实际修改这里就能满足要求了。
b、下面给一个例子:
UpdateCmdLineParams 函数修改:
+ Src = Param->BoardCmdLine;
+ AsciiStrCatS (Dst, MaxCmdLineLen, Src);
UpdateCmdLine 函数修改:
+ UINT32 BoardCmdNum = 0;
+ CHAR8 BoardCmdLineStr[BOARD_CMDLINE_LENGTH] = "\0";+ BoardCmdNum = 1;
+ AsciiSPrint (BoardCmdLineStr, sizeof (BoardCmdLineStr),
+ "%a%d", BoardCmdline, BoardCmdNum);
+ CmdLineLen += AsciiStrLen (BoardCmdLineStr);+ Param.BoardCmdLine = BoardCmdLineStr;
由于没有贴全,注意修改的位置及变量声明
更多推荐
高通uefi的abl增加新的kernel cmdlin标签经验分享
发布评论