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:
Rom Lemarchand 2015-02-28 06:39:11 -08:00 committed by Rom Lemarchand
parent 05c9f698f2
commit cbcbea27c7
1 changed files with 48 additions and 5 deletions

View File

@ -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);