高通UEFI:ABL(一)中简单讲述了abl内的代码组成及大致框架,目的在于明确当我们接到uefi abl阶段的需求时我们应该定位到哪一部分去进行修改,本篇文章着重分析abl内的cmdline内的各个属性是如何组合以及如何在cmdline内新增一个属性
查看cmdline指令
cat proc/cmdline
C:\Users\ASUS>adb shell cat proc/cmdline
rcupdate.rcu_expedited=1 rcu_nocbs=0-7 console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 swiotlb=1 earlycon=msm_geni_serial,0x4a90000 loop.max_part=7 cgroup.memory=nokmem,nosocket buildvariant=userdebug androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.vbmeta.device=PARTUUID=114b079b-bebb-5bc7-df1d-a601ce62eccc androidboot.vbmeta.device=PARTUUID=114b079b-bebb-5bc7-df1d-a601ce62eccc androidboot.vbmeta.avb_version=1.0 androidboot.vbmeta.device_state=unlocked androidboot.vbmeta.hash_alg=sha256 androidboot.vbmeta.size=5952 androidboot.vbmeta.digest=63f3b52c331995987d9f25fd57551bb8720901266848502d4cadb62ad729a5ef androidboot.veritymode=disabled androidboot.bootdevice=4804000.ufshc androidboot.boot_devices=soc/4804000.ufshc androidboot.serialno=12345678
androidboot.baseband=msm androidboot.slot_suffix=_a rootwait ro init=/init androidboot.dtb_idx=0
以androidboot.slot_suffix=_a这个属性值为例子,看看abl阶段是怎么设置的
执行grep -nrs androidboot.slot_ .
./Library/BootLib/UpdateCmdLine.c:64:STATIC CHAR8 *AndroidSlotSuffix = " androidboot.slot_suffix=";
可以看到,androidboot.slot_suffix=这个属性值是由AndroidSlotSuffix这个变量去完成的。看看这个变量做了什么
EFI_STATUS
UpdateCmdLine (CONST CHAR8 *CmdLine,
CHAR8 *FfbmStr,
BOOLEAN Recovery,
BOOLEAN AlarmBoot,
CONST CHAR8 *VBCmdLine,
CHAR8 **FinalCmdLine)
{
EFI_STATUS Status;
UINT32 CmdLineLen = 0;
UINT32 HaveCmdLine = 0;
UINT32 PauseAtBootUp = 0;
CHAR8 SlotSuffixAscii[MAX_SLOT_SUFFIX_SZ];
BOOLEAN MultiSlotBoot;
CHAR8 ChipBaseBand[CHIP_BASE_BAND_LEN];
CHAR8 *BootDevBuf = NULL;
BOOLEAN BatteryStatus;
CHAR8 StrSerialNum[SERIAL_NUM_SIZE];
BOOLEAN MdtpActive = FALSE;
CHAR8 *CvmSystemPtnCmdLine = NULL;
UpdateCmdLineParamList Param = {0};
CHAR8 DtboIdxStr[MAX_DTBO_IDX_STR] = "\0";
CHAR8 DtbIdxStr[MAX_DTBO_IDX_STR] = "\0";
INT32 DtboIdx = INVALID_PTN;
INT32 DtbIdx = INVALID_PTN;
CHAR8 *LEVerityCmdLine = NULL;
UINT32 LEVerityCmdLineLen = 0;
CHAR8 UsbCompositionCmdline[COMPOSITION_CMDLINE_LEN]= "\0";
CHAR8 *EarlyServicesStr = NULL;
...
Param.AndroidSlotSuffix = AndroidSlotSuffix;
Param.SkipRamFs = SkipRamFs;
Param.RootCmdLine = RootCmdLine;
Param.InitCmdline = InitCmdline;
Param.DtboIdxStr = DtboIdxStr;
Param.DtbIdxStr = DtbIdxStr;
Param.LEVerityCmdLine = LEVerityCmdLine;
Param.CvmSystemPtnCmdLine = CvmSystemPtnCmdLine;
Param.EarlyServicesCmdLine = EarlyServicesStr;
if (EarlyUsbInitEnabled ()) {
Param.UsbCompCmdLine = UsbCompositionCmdline;
}
Status = UpdateCmdLineParams (&Param, FinalCmdLine);
if (Status != EFI_SUCCESS) {
return Status;
}
DEBUG ((EFI_D_INFO, "Cmdline: %a\n", *FinalCmdLine));
DEBUG ((EFI_D_INFO, "\n"));
return EFI_SUCCESS;
}
UpdadeCmdline.c内需要关注的就2个地方:
1.UpdateCmdLineParamList Param = {0};
2.Param.AndroidSlotSuffix = AndroidSlotSuffix;
3.UpdateCmdLineParams (&Param, FinalCmdLine);
可以看到许多的属性值都是放置在Param这个UpdateCmdLineParamList结构体内的,并且在UpdadeCmdline.c内并没有看到关于AndroidSlotSuffix的赋值处理,那么再看看UpdateCmdLineParams内对AndroidSlotSuffix做了什么
//UpdadeCmdline.h内UpdateCmdLineParamList 结构体成员
typedef struct UpdateCmdLineParamList {
BOOLEAN Recovery;
BOOLEAN MultiSlotBoot;
BOOLEAN AlarmBoot;
BOOLEAN MdtpActive;
UINT32 CmdLineLen;
UINT32 HaveCmdLine;
UINT32 PauseAtBootUp;
CHAR8 *StrSerialNum;
CHAR8 *SlotSuffixAscii;
CHAR8 *ChipBaseBand;
CHAR8 *DisplayCmdLine;
CONST CHAR8 *CmdLine;
CONST CHAR8 *AlarmBootCmdLine;
CONST CHAR8 *MdtpActiveFlag;
CONST CHAR8 *BatteryChgPause;
CONST CHAR8 *UsbSerialCmdLine;
CONST CHAR8 *VBCmdLine;
CONST CHAR8 *LogLevel;
CONST CHAR8 *BootDeviceCmdLine;
CONST CHAR8 *AndroidBootMode;
CHAR8 *BootDevBuf;
CHAR8 *FfbmStr;
CHAR8 *AndroidSlotSuffix;
CHAR8 *SkipRamFs;
CHAR8 *RootCmdLine;
CHAR8 *InitCmdline;
CHAR8 *DtboIdxStr;
CHAR8 *DtbIdxStr;
CHAR8 *LEVerityCmdLine;
CHAR8 *CvmSystemPtnCmdLine;
CHAR8 *UsbCompCmdLine;
CHAR8 *EarlyServicesCmdLine;
} UpdateCmdLineParamList;
STATIC
EFI_STATUS
UpdateCmdLineParams (UpdateCmdLineParamList *Param,
CHAR8 **FinalCmdLine)
{
CONST CHAR8 *Src;
CHAR8 *Dst;
UINT32 MaxCmdLineLen = Param->CmdLineLen;
//分配内存
Dst = AllocateZeroPool (MaxCmdLineLen);
if (!Dst) {
DEBUG ((EFI_D_ERROR, "CMDLINE: Failed to allocate destination buffer\n"));
return EFI_OUT_OF_RESOURCES;
}
/* Save start ptr for debug print */
*FinalCmdLine = Dst;
...
if (Param->MultiSlotBoot &&
!IsBootDevImage ()) {
/* Slot suffix */
Src = Param->AndroidSlotSuffix;
AsciiStrCatS (Dst, MaxCmdLineLen, Src);
//获取到的suffix进行转码
UnicodeStrToAsciiStr (GetCurrentSlotSuffix ().Suffix,
Param->SlotSuffixAscii);
Src = Param->SlotSuffixAscii;
AsciiStrCatS (Dst, MaxCmdLineLen, Src);
}
...
return EFI_SUCCESS;
}
在UpdateCmdLineParams内,会对UpdateCmdLine内没有处理的属性值进行一一处理,对于AndroidSlotSuffix,则是通过GetCurrentSlotSuffix获取到的crrentslot属性后进行转码,追加到cmdline内。
到此,我们基本了解了关于AndroidSlotSuffix这个属性值是怎么添加到cmdline内的了。分为以下几步:
1.确定好自己要添加的属性名称以及编写相应的数据获取逻辑
2.在UpdateCmdLine.c内初始化一个STATIC类型的属性变量
3.将2中初始化的变量添加到parms内
4.将1编写好的数据获取函数追加到UpdateCmdLineParams函数内