[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2] Initial support for the android bootimg filesystem.
From: |
Shea Levy |
Subject: |
[PATCH v2] Initial support for the android bootimg filesystem. |
Date: |
Tue, 26 Jan 2016 14:42:29 -0500 |
Currently, the kernel and, if present, the ramdisk are made available as
regular files.
---
grub-core/Makefile.core.def | 7 ++
grub-core/fs/android_bootimg.c | 271 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 278 insertions(+)
create mode 100644 grub-core/fs/android_bootimg.c
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 0cc40bb..a726abd 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -1231,6 +1231,13 @@ module = {
};
module = {
+ name = android_bootimg;
+ common = fs/android_bootimg.c;
+ cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
+ cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
+};
+
+module = {
name = bfs;
common = fs/bfs.c;
};
diff --git a/grub-core/fs/android_bootimg.c b/grub-core/fs/android_bootimg.c
new file mode 100644
index 0000000..093307a
--- /dev/null
+++ b/grub-core/fs/android_bootimg.c
@@ -0,0 +1,271 @@
+/* android-bootimg.c - android bootimg filesystem. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2016 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdint.h>
+#include <grub/dl.h>
+#include <grub/file.h>
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+/* from
https://android.googlesource.com/platform/system/core/+/506d233e7ac8ca4efa80768153d842c296477f99/mkbootimg/bootimg.h
*/
+/* From here until the end of struct boot_img_hdr available under the
following terms:
+ *
+ * Copyright 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define BOOT_MAGIC "ANDROID!"
+#define BOOT_MAGIC_SIZE 8
+#define BOOT_NAME_SIZE 16
+#define BOOT_ARGS_SIZE 512
+#define BOOT_EXTRA_ARGS_SIZE 1024
+
+struct boot_img_hdr
+{
+ uint8_t magic[BOOT_MAGIC_SIZE];
+
+ uint32_t kernel_size;
+ uint32_t kernel_addr;
+
+ uint32_t ramdisk_size;
+ uint32_t ramdisk_addr;
+
+ uint32_t second_size;
+ uint32_t second_addr;
+
+ uint32_t tags_addr;
+ uint32_t page_size;
+ uint32_t unused[2];
+
+ uint8_t name[BOOT_NAME_SIZE];
+
+ uint8_t cmdline[BOOT_ARGS_SIZE];
+
+ uint32_t id[8];
+
+ uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
+} GRUB_PACKED;
+
+typedef enum
+ {
+ ROOT,
+ KERNEL,
+ RAMDISK,
+ NOT_FOUND,
+ BAD_NAME
+ }
+grub_android_bootimg_filename_t;
+
+static grub_android_bootimg_filename_t
+handle_path (const char *path)
+{
+ if (!path || path[0] != '/')
+ return BAD_NAME;
+
+ const char *path_iter;
+ for (path_iter = path + 1; *path_iter; ++path_iter) {
+ if (*path_iter == '/')
+ continue;
+ if (*path_iter == '.') {
+ if (*(++path_iter) == '/')
+ continue;
+ else if (*path_iter == '.' && *(++path_iter) == '/')
+ continue;
+ else
+ return NOT_FOUND;
+ }
+ break;
+ }
+
+ if (!*path_iter)
+ return ROOT;
+ else if (grub_strcmp (path_iter, "kernel") == 0)
+ return KERNEL;
+ else if (grub_strcmp (path_iter, "ramdisk") == 0)
+ return RAMDISK;
+ else
+ return NOT_FOUND;
+}
+
+static grub_err_t
+read_hdr (grub_disk_t disk, struct boot_img_hdr *hd)
+{
+ if (grub_disk_read (disk, 0, 0, sizeof *hd, hd))
+ goto fail;
+
+ if (grub_memcmp (hd->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE))
+ goto fail;
+
+ if (hd->unused[0] || hd->unused[1])
+ goto fail;
+
+ return GRUB_ERR_NONE;
+
+fail:
+ return grub_error (GRUB_ERR_BAD_FS, N_("%s not an android bootimg"),
+ disk->name);
+}
+
+static grub_err_t
+grub_android_bootimg_dir (grub_device_t device, const char *path,
+ grub_fs_dir_hook_t hook, void *hook_data)
+{
+ struct boot_img_hdr hd;
+
+ if (read_hdr (device->disk, &hd))
+ return grub_errno;
+
+ grub_android_bootimg_filename_t file = handle_path (path);
+ if (file == NOT_FOUND)
+ return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("directory `%s' not found"),
+ path);
+ else if (file == BAD_NAME)
+ return grub_error (GRUB_ERR_BAD_FILENAME, N_("invalid directory name
`%s'"),
+ path);
+ else if (file != ROOT)
+ return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("`%s' not a directory"),
+ path);
+
+ struct grub_dirhook_info info = {
+ .dir = 1,
+ .mtimeset = 0,
+ .case_insensitive = 0,
+ .inodeset = 0,
+ .mtime = 0,
+ .inode = 0
+ };
+
+ if (hook (".", &info, hook_data)) {
+ return grub_errno;
+ }
+
+ if (hook ("..", &info, hook_data)) {
+ return grub_errno;
+ }
+
+ info.dir = 0;
+
+ if (hook ("kernel", &info, hook_data)) {
+ return grub_errno;
+ }
+
+ if (hd.ramdisk_size != 0) {
+ if (hook ("ramdisk", &info, hook_data)) {
+ return grub_errno;
+ }
+ }
+
+ return GRUB_ERR_NONE;
+}
+
+static grub_err_t
+grub_android_bootimg_open (grub_file_t file, const char *name)
+{
+ struct boot_img_hdr hd;
+
+ if (read_hdr (file->device->disk, &hd))
+ return grub_errno;
+
+ grub_off_t *begin_offset;
+
+ grub_android_bootimg_filename_t fn = handle_path (name);
+ switch (fn)
+ {
+ case NOT_FOUND:
+ return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"),
+ name);
+ case BAD_NAME:
+ return grub_error (GRUB_ERR_BAD_FILENAME, N_("bad file name `%s'"),
name);
+ case ROOT:
+ return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("`%s' not a regular file"),
+ name);
+ case KERNEL:
+ begin_offset = grub_malloc (sizeof *begin_offset);
+ *begin_offset = hd.page_size;
+ file->data = begin_offset;
+ file->size = hd.kernel_size;
+ break;
+ case RAMDISK:
+ begin_offset = grub_malloc (sizeof *begin_offset);
+ *begin_offset =
+ hd.page_size * (1 + (hd.kernel_size + hd.page_size - 1) /
hd.page_size);
+ file->data = begin_offset;
+ file->size = hd.ramdisk_size;
+ break;
+ }
+
+ return GRUB_ERR_NONE;
+}
+
+static grub_ssize_t
+grub_android_bootimg_read (grub_file_t file, char *buf, grub_size_t len)
+{
+ grub_size_t len_left = file->size - file->offset;
+ len = len > len_left ? len_left : len;
+ grub_off_t *begin_offset = file->data;
+ grub_off_t actual_offset = *begin_offset + file->offset;
+ file->device->disk->read_hook = file->read_hook;
+ file->device->disk->read_hook_data = file->read_hook_data;
+ grub_errno = grub_disk_read (file->device->disk, 0, actual_offset, len, buf);
+ file->device->disk->read_hook = 0;
+
+ if (grub_errno)
+ return -1;
+ else
+ return len;
+}
+
+static grub_err_t
+grub_android_bootimg_close (grub_file_t file)
+{
+ grub_free (file->data);
+ return GRUB_ERR_NONE;
+}
+
+static struct grub_fs grub_android_bootimg_fs = {
+ .name = "android_bootimg",
+ .dir = grub_android_bootimg_dir,
+ .open = grub_android_bootimg_open,
+ .read = grub_android_bootimg_read,
+ .close = grub_android_bootimg_close,
+#ifdef GRUB_UTIL
+ .reserved_first_sector = 0,
+ .blocklist_install = 0,
+#endif
+};
+
+GRUB_MOD_INIT (android_bootimg)
+{
+ grub_fs_register (&grub_android_bootimg_fs);
+}
+
+GRUB_MOD_FINI (android_bootimg)
+{
+ grub_fs_unregister (&grub_android_bootimg_fs);
+}
--
2.7.0
- [PATCH v2] Initial support for the android bootimg filesystem.,
Shea Levy <=
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Andrei Borzenkov, 2016/01/27
- Re: [PATCH v2] Initial support for the android bootimg filesystem., shea, 2016/01/27
- Re: [PATCH v2] Initial support for the android bootimg filesystem., shea, 2016/01/28
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Andrei Borzenkov, 2016/01/29
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Shea Levy, 2016/01/29
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Vladimir 'phcoder' Serbinenko, 2016/01/29
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Andrei Borzenkov, 2016/01/29
- Re: [PATCH v2] Initial support for the android bootimg filesystem., shea, 2016/01/29
- Re: [PATCH v2] Initial support for the android bootimg filesystem., Michael Zimmermann, 2016/01/29