Parse boot properties from device tree
- Make sure compatible DT node is "android,firmware" - Set ro.boot.* properties from firmware/android/ DT node Change-Id: If3d0716831516cb3d3fde1f75d57e2691d42d054
This commit is contained in:
parent
05c9f698f2
commit
cbcbea27c7
|
@ -31,6 +31,9 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <selinux/selinux.h>
|
||||
#include <selinux/label.h>
|
||||
|
@ -45,6 +48,8 @@
|
|||
#include <cutils/fs.h>
|
||||
#include <private/android_filesystem_config.h>
|
||||
#include <termios.h>
|
||||
#include <utils/file.h>
|
||||
#include <utils/stringprintf.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "init.h"
|
||||
|
@ -791,6 +796,40 @@ static void export_kernel_boot_props(void)
|
|||
property_set("ro.factorytest", "0");
|
||||
}
|
||||
|
||||
static void process_kernel_dt(void)
|
||||
{
|
||||
static const char android_dir[] = "/proc/device-tree/firmware/android";
|
||||
|
||||
std::string file_name = android::StringPrintf("%s/compatible", android_dir);
|
||||
|
||||
std::string dt_file;
|
||||
android::ReadFileToString(file_name, &dt_file);
|
||||
if (!dt_file.compare("android,firmware")) {
|
||||
ERROR("firmware/android is not compatible with 'android,firmware'\n");
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_ptr<DIR, int(*)(DIR*)>dir(opendir(android_dir), closedir);
|
||||
if (!dir)
|
||||
return;
|
||||
|
||||
struct dirent *dp;
|
||||
while ((dp = readdir(dir.get())) != NULL) {
|
||||
if (dp->d_type != DT_REG || !strcmp(dp->d_name, "compatible"))
|
||||
continue;
|
||||
|
||||
file_name = android::StringPrintf("%s/%s", android_dir, dp->d_name);
|
||||
|
||||
android::ReadFileToString(file_name, &dt_file);
|
||||
std::replace(dt_file.begin(), dt_file.end(), ',', '.');
|
||||
|
||||
std::string property_name = android::StringPrintf("ro.boot.%s", dp->d_name);
|
||||
if (property_set(property_name.c_str(), dt_file.c_str())) {
|
||||
ERROR("Could not set property %s to value %s", property_name.c_str(), dt_file.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void process_kernel_cmdline(void)
|
||||
{
|
||||
/* don't expose the raw commandline to nonpriv processes */
|
||||
|
@ -803,11 +842,6 @@ static void process_kernel_cmdline(void)
|
|||
import_kernel_cmdline(0, import_kernel_nv);
|
||||
if (qemu[0])
|
||||
import_kernel_cmdline(1, import_kernel_nv);
|
||||
|
||||
/* now propogate the info given on command line to internal variables
|
||||
* used by init as well as the current required properties
|
||||
*/
|
||||
export_kernel_boot_props();
|
||||
}
|
||||
|
||||
static int property_service_init_action(int nargs, char **args)
|
||||
|
@ -1005,8 +1039,17 @@ int main(int argc, char **argv)
|
|||
klog_init();
|
||||
property_init();
|
||||
|
||||
process_kernel_dt();
|
||||
/* in case one is passing arguments both on the command line and in DT
|
||||
* Properties set in DT always have priority over the command-line ones
|
||||
*/
|
||||
process_kernel_cmdline();
|
||||
|
||||
/* now propogate the kernel variables to internal variables
|
||||
* used by init as well as the current required properties
|
||||
*/
|
||||
export_kernel_boot_props();
|
||||
|
||||
union selinux_callback cb;
|
||||
cb.func_log = log_callback;
|
||||
selinux_set_callback(SELINUX_CB_LOG, cb);
|
||||
|
|
Loading…
Reference in New Issue