mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-25 07:47:38 +00:00
Support EMUI 9.0
This commit is contained in:
parent
01344c451f
commit
3c6c0e6700
@ -54,7 +54,7 @@ static bool mnt_system = false;
|
|||||||
static bool mnt_vendor = false;
|
static bool mnt_vendor = false;
|
||||||
|
|
||||||
struct cmdline {
|
struct cmdline {
|
||||||
bool skip_initramfs;
|
bool early_boot;
|
||||||
char slot[3];
|
char slot[3];
|
||||||
char dt_dir[128];
|
char dt_dir[128];
|
||||||
};
|
};
|
||||||
@ -75,6 +75,10 @@ static void parse_cmdline(struct cmdline *cmd) {
|
|||||||
int fd = open("/proc/cmdline", O_RDONLY | O_CLOEXEC);
|
int fd = open("/proc/cmdline", O_RDONLY | O_CLOEXEC);
|
||||||
cmdline[read(fd, cmdline, sizeof(cmdline))] = '\0';
|
cmdline[read(fd, cmdline, sizeof(cmdline))] = '\0';
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
bool skip_initramfs = false, kirin = false;
|
||||||
|
int enter_recovery = 0;
|
||||||
|
|
||||||
for (char *tok = strtok(cmdline, " "); tok; tok = strtok(nullptr, " ")) {
|
for (char *tok = strtok(cmdline, " "); tok; tok = strtok(nullptr, " ")) {
|
||||||
if (strncmp(tok, "androidboot.slot_suffix", 23) == 0) {
|
if (strncmp(tok, "androidboot.slot_suffix", 23) == 0) {
|
||||||
sscanf(tok, "androidboot.slot_suffix=%s", cmd->slot);
|
sscanf(tok, "androidboot.slot_suffix=%s", cmd->slot);
|
||||||
@ -82,16 +86,21 @@ static void parse_cmdline(struct cmdline *cmd) {
|
|||||||
cmd->slot[0] = '_';
|
cmd->slot[0] = '_';
|
||||||
sscanf(tok, "androidboot.slot=%c", cmd->slot + 1);
|
sscanf(tok, "androidboot.slot=%c", cmd->slot + 1);
|
||||||
} else if (strcmp(tok, "skip_initramfs") == 0) {
|
} else if (strcmp(tok, "skip_initramfs") == 0) {
|
||||||
cmd->skip_initramfs = true;
|
skip_initramfs = true;
|
||||||
} else if (strncmp(tok, "androidboot.android_dt_dir", 26) == 0) {
|
} else if (strncmp(tok, "androidboot.android_dt_dir", 26) == 0) {
|
||||||
sscanf(tok, "androidboot.android_dt_dir=%s", cmd->dt_dir);
|
sscanf(tok, "androidboot.android_dt_dir=%s", cmd->dt_dir);
|
||||||
|
} else if (strncmp(tok, "enter_recovery", 14) == 0) {
|
||||||
|
sscanf(tok, "enter_recovery=%d", &enter_recovery);
|
||||||
|
} else if (strncmp(tok, "androidboot.hardware", 20) == 0) {
|
||||||
|
kirin = strstr(tok, "kirin") != nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cmd->early_boot = skip_initramfs || (kirin && enter_recovery);
|
||||||
|
|
||||||
if (cmd->dt_dir[0] == '\0')
|
if (cmd->dt_dir[0] == '\0')
|
||||||
strcpy(cmd->dt_dir, DEFAULT_DT_DIR);
|
strcpy(cmd->dt_dir, DEFAULT_DT_DIR);
|
||||||
|
|
||||||
LOGD("cmdline: skip_initramfs[%d] slot[%s] dt_dir[%s]\n", cmd->skip_initramfs, cmd->slot, cmd->dt_dir);
|
LOGD("cmdline: early_boot[%d] slot[%s] dt_dir[%s]\n", cmd->early_boot, cmd->slot, cmd->dt_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_device(struct device *dev, const char *uevent) {
|
static void parse_device(struct device *dev, const char *uevent) {
|
||||||
@ -377,7 +386,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
root = open("/", O_RDONLY | O_CLOEXEC);
|
root = open("/", O_RDONLY | O_CLOEXEC);
|
||||||
|
|
||||||
if (cmd.skip_initramfs) {
|
if (cmd.early_boot) {
|
||||||
// Clear rootfs
|
// Clear rootfs
|
||||||
const char *excl[] = { "overlay", ".backup", "proc", "sys", "init.bak", nullptr };
|
const char *excl[] = { "overlay", ".backup", "proc", "sys", "init.bak", nullptr };
|
||||||
excl_list = excl;
|
excl_list = excl;
|
||||||
@ -389,7 +398,7 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Do not go further if system_root device is booting as recovery
|
// Do not go further if system_root device is booting as recovery
|
||||||
if (!cmd.skip_initramfs && access("/sbin/recovery", F_OK) == 0) {
|
if (!cmd.early_boot && access("/sbin/recovery", F_OK) == 0) {
|
||||||
// Remove Magisk traces
|
// Remove Magisk traces
|
||||||
rm_rf("/.backup");
|
rm_rf("/.backup");
|
||||||
exec_init(argv);
|
exec_init(argv);
|
||||||
@ -402,7 +411,7 @@ int main(int argc, char *argv[]) {
|
|||||||
struct device dev;
|
struct device dev;
|
||||||
char partname[32];
|
char partname[32];
|
||||||
|
|
||||||
if (cmd.skip_initramfs) {
|
if (cmd.early_boot) {
|
||||||
sprintf(partname, "system%s", cmd.slot);
|
sprintf(partname, "system%s", cmd.slot);
|
||||||
setup_block(&dev, partname);
|
setup_block(&dev, partname);
|
||||||
xmkdir("/system_root", 0755);
|
xmkdir("/system_root", 0755);
|
||||||
|
@ -68,8 +68,8 @@ find_block() {
|
|||||||
for uevent in /sys/dev/block/*/uevent; do
|
for uevent in /sys/dev/block/*/uevent; do
|
||||||
local DEVNAME=`grep_prop DEVNAME $uevent`
|
local DEVNAME=`grep_prop DEVNAME $uevent`
|
||||||
local PARTNAME=`grep_prop PARTNAME $uevent`
|
local PARTNAME=`grep_prop PARTNAME $uevent`
|
||||||
for p in "$@"; do
|
for BLOCK in "$@"; do
|
||||||
if [ "`toupper $p`" = "`toupper $PARTNAME`" ]; then
|
if [ "`toupper $BLOCK`" = "`toupper $PARTNAME`" ]; then
|
||||||
echo /dev/block/$DEVNAME
|
echo /dev/block/$DEVNAME
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@ -185,9 +185,9 @@ run_migrations() {
|
|||||||
find_boot_image() {
|
find_boot_image() {
|
||||||
BOOTIMAGE=
|
BOOTIMAGE=
|
||||||
if [ ! -z $SLOT ]; then
|
if [ ! -z $SLOT ]; then
|
||||||
BOOTIMAGE=`find_block boot$SLOT ramdisk$SLOT`
|
BOOTIMAGE=`find_block ramdisk$SLOT recovery_ramdisk$SLOT boot$SLOT`
|
||||||
else
|
else
|
||||||
BOOTIMAGE=`find_block boot ramdisk boot_a kern-a android_boot kernel lnx bootimg`
|
BOOTIMAGE=`find_block ramdisk recovery_ramdisk boot boot_a kern-a android_boot kernel lnx bootimg`
|
||||||
fi
|
fi
|
||||||
if [ -z $BOOTIMAGE ]; then
|
if [ -z $BOOTIMAGE ]; then
|
||||||
# Lets see what fstabs tells me
|
# Lets see what fstabs tells me
|
||||||
|
Loading…
x
Reference in New Issue
Block a user