Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
74aae523
Commit
74aae523
authored
Oct 20, 2018
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Properly support boot image header v1
Close #695
parent
48c40f95
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
555 additions
and
37 deletions
+555
-37
Android.mk
native/jni/Android.mk
+1
-1
bootimg.cpp
native/jni/magiskboot/bootimg.cpp
+459
-0
bootimg.h
native/jni/magiskboot/bootimg.h
+93
-33
format.c
native/jni/magiskboot/format.c
+0
-1
magiskboot.h
native/jni/magiskboot/magiskboot.h
+2
-2
No files found.
native/jni/Android.mk
View file @
74aae523
...
@@ -102,7 +102,7 @@ LOCAL_C_INCLUDES := \
...
@@ -102,7 +102,7 @@ LOCAL_C_INCLUDES := \
LOCAL_SRC_FILES := \
LOCAL_SRC_FILES := \
magiskboot/cpio.c \
magiskboot/cpio.c \
magiskboot/main.c \
magiskboot/main.c \
magiskboot/bootimg.c \
magiskboot/bootimg.c
pp
\
magiskboot/hexpatch.c \
magiskboot/hexpatch.c \
magiskboot/compress.c \
magiskboot/compress.c \
magiskboot/format.c \
magiskboot/format.c \
...
...
native/jni/magiskboot/bootimg.c
→
native/jni/magiskboot/bootimg.c
pp
View file @
74aae523
This diff is collapsed.
Click to expand it.
native/jni/magiskboot/bootimg.h
View file @
74aae523
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
#ifndef _BOOT_IMAGE_H_
#ifndef _BOOT_IMAGE_H_
#define _BOOT_IMAGE_H_
#define _BOOT_IMAGE_H_
typedef
struct
boot_img_hdr
{
struct
boot_img_hdr_base
{
char
magic
[
8
];
char
magic
[
8
];
uint32_t
kernel_size
;
/* size in bytes */
uint32_t
kernel_size
;
/* size in bytes */
...
@@ -15,10 +15,19 @@ typedef struct boot_img_hdr {
...
@@ -15,10 +15,19 @@ typedef struct boot_img_hdr {
uint32_t
second_size
;
/* size in bytes */
uint32_t
second_size
;
/* size in bytes */
uint32_t
second_addr
;
/* physical load addr */
uint32_t
second_addr
;
/* physical load addr */
}
__attribute__
((
packed
));
struct
boot_img_hdr_v0
:
public
boot_img_hdr_base
{
uint32_t
tags_addr
;
/* physical addr for kernel tags */
uint32_t
tags_addr
;
/* physical addr for kernel tags */
uint32_t
page_size
;
/* flash page size we assume */
uint32_t
page_size
;
/* flash page size we assume */
uint32_t
extra_size
;
/* extra blob size in bytes */
/* In header v1, this field is used for header version
* However, on some devices like Samsung, this field is used to store DTB
* We will treat this field differently based on its value */
union
{
uint32_t
header_version
;
/* the version of the header */
uint32_t
extra_size
;
/* extra blob size in bytes */
};
/* operating system version and security patch level; for
/* operating system version and security patch level; for
* version "A.B.C" and patch level "Y-M-D":
* version "A.B.C" and patch level "Y-M-D":
...
@@ -34,20 +43,19 @@ typedef struct boot_img_hdr {
...
@@ -34,20 +43,19 @@ typedef struct boot_img_hdr {
/* Supplemental command line data; kept here to maintain
/* Supplemental command line data; kept here to maintain
* binary compatibility with older versions of mkbootimg */
* binary compatibility with older versions of mkbootimg */
char
extra_cmdline
[
1024
];
char
extra_cmdline
[
1024
];
}
__attribute__
((
packed
))
boot_img_hdr
;
}
__attribute__
((
packed
));
typedef
struct
pxa_boot_img_hdr
{
char
magic
[
8
];
uint32_t
kernel_size
;
/* size in bytes */
uint32_t
kernel_addr
;
/* physical load addr */
uint32_t
ramdisk_size
;
/* size in bytes */
struct
boot_img_hdr_v1
:
public
boot_img_hdr_v0
{
uint32_t
ramdisk_addr
;
/* physical load addr */
uint32_t
recovery_dtbo_size
;
/* size in bytes for recovery DTBO image */
uint64_t
recovery_dtbo_offset
;
/* offset to recovery dtbo in boot image */
uint32_t
header_size
;
}
__attribute__
((
packed
));
uint32_t
second_size
;
/* size in bytes */
// Default to hdr v1
uint32_t
second_addr
;
/* physical load addr */
typedef
boot_img_hdr_v1
boot_img_hdr
;
// Special Samsung header
struct
boot_img_hdr_pxa
:
public
boot_img_hdr_base
{
uint32_t
extra_size
;
/* extra blob size in bytes */
uint32_t
extra_size
;
/* extra blob size in bytes */
uint32_t
unknown
;
/* unknown value */
uint32_t
unknown
;
/* unknown value */
uint32_t
tags_addr
;
/* physical addr for kernel tags */
uint32_t
tags_addr
;
/* physical addr for kernel tags */
...
@@ -60,7 +68,7 @@ typedef struct pxa_boot_img_hdr {
...
@@ -60,7 +68,7 @@ typedef struct pxa_boot_img_hdr {
/* Supplemental command line data; kept here to maintain
/* Supplemental command line data; kept here to maintain
* binary compatibility with older versions of mkbootimg */
* binary compatibility with older versions of mkbootimg */
char
extra_cmdline
[
1024
];
char
extra_cmdline
[
1024
];
}
__attribute__
((
packed
))
pxa_boot_img_hdr
;
}
__attribute__
((
packed
));
/*
/*
** +-----------------+
** +-----------------+
...
@@ -74,11 +82,14 @@ typedef struct pxa_boot_img_hdr {
...
@@ -74,11 +82,14 @@ typedef struct pxa_boot_img_hdr {
** +-----------------+
** +-----------------+
** | extra blob | p pages
** | extra blob | p pages
** +-----------------+
** +-----------------+
** | recovery dtbo | q pages
** +-----------------+
**
**
** n = (kernel_size + page_size - 1) / page_size
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
** p = (extra_size + page_size - 1) / page_size
** p = (extra_size + page_size - 1) / page_size
** q = (recovery_dtbo_size + page_size - 1) / page_size
**
**
** 0. all entities are page_size aligned in flash
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 1. kernel and ramdisk are required (size != 0)
...
@@ -92,19 +103,19 @@ typedef struct pxa_boot_img_hdr {
...
@@ -92,19 +103,19 @@ typedef struct pxa_boot_img_hdr {
** else: jump to kernel_addr
** else: jump to kernel_addr
*/
*/
typedef
struct
mtk_hdr
{
struct
mtk_hdr
{
uint32_t
magic
;
/* MTK magic */
uint32_t
magic
;
/* MTK magic */
uint32_t
size
;
/* Size of the content */
uint32_t
size
;
/* Size of the content */
char
name
[
32
];
/* The type of the header */
char
name
[
32
];
/* The type of the header */
}
__attribute__
((
packed
))
mtk_hdr
;
}
__attribute__
((
packed
));
typedef
struct
dhtb_hdr
{
struct
dhtb_hdr
{
char
magic
[
8
];
/* DHTB magic */
char
magic
[
8
];
/* DHTB magic */
uint8_t
checksum
[
40
];
/* Payload SHA256, whole image + SEANDROIDENFORCE + 0xFFFFFFFF */
uint8_t
checksum
[
40
];
/* Payload SHA256, whole image + SEANDROIDENFORCE + 0xFFFFFFFF */
uint32_t
size
;
/* Payload size, whole image + SEANDROIDENFORCE + 0xFFFFFFFF */
uint32_t
size
;
/* Payload size, whole image + SEANDROIDENFORCE + 0xFFFFFFFF */
}
__attribute__
((
packed
))
dhtb_hdr
;
}
__attribute__
((
packed
));
typedef
struct
blob_hdr
{
struct
blob_hdr
{
char
secure_magic
[
20
];
/* "-SIGNED-BY-SIGNBLOB-" */
char
secure_magic
[
20
];
/* "-SIGNED-BY-SIGNBLOB-" */
uint32_t
datalen
;
/* 0x00000000 */
uint32_t
datalen
;
/* 0x00000000 */
uint32_t
signature
;
/* 0x00000000 */
uint32_t
signature
;
/* 0x00000000 */
...
@@ -118,7 +129,7 @@ typedef struct blob_hdr {
...
@@ -118,7 +129,7 @@ typedef struct blob_hdr {
uint32_t
offset
;
/* offset in blob where this partition starts */
uint32_t
offset
;
/* offset in blob where this partition starts */
uint32_t
size
;
/* Size of data */
uint32_t
size
;
/* Size of data */
uint32_t
version
;
/* 0x00000001 */
uint32_t
version
;
/* 0x00000001 */
}
__attribute__
((
packed
))
blob_hdr
;
}
__attribute__
((
packed
));
// Flags
// Flags
#define MTK_KERNEL 0x0001
#define MTK_KERNEL 0x0001
...
@@ -133,16 +144,16 @@ typedef struct blob_hdr {
...
@@ -133,16 +144,16 @@ typedef struct blob_hdr {
#define NOOKHD_FLAG 0x0200
#define NOOKHD_FLAG 0x0200
#define ACCLAIM_FLAG 0x0400
#define ACCLAIM_FLAG 0x0400
typedef
struct
boot_img
{
struct
boot_img
{
// Memory map of the whole image
// Memory map of the whole image
void
*
map_addr
;
uint8_t
*
map_addr
;
size_t
map_size
;
size_t
map_size
;
// Headers
// Headers
void
*
hdr
;
/* Either boot_img_hdr or pxa_boot_img_hd
r */
boot_img_hdr_base
*
hdr
;
/* Android boot image heade
r */
mtk_hdr
*
k_hdr
;
/* MTK kernel header */
mtk_hdr
*
k_hdr
;
/* MTK kernel header */
mtk_hdr
*
r_hdr
;
/* MTK ramdisk header */
mtk_hdr
*
r_hdr
;
/* MTK ramdisk header */
blob_hdr
*
b_hdr
;
/* Tegra blob header */
blob_hdr
*
b_hdr
;
/* Tegra blob header */
// Flags to indicate the state of current boot image
// Flags to indicate the state of current boot image
uint16_t
flags
;
uint16_t
flags
;
...
@@ -152,18 +163,67 @@ typedef struct boot_img {
...
@@ -152,18 +163,67 @@ typedef struct boot_img {
format_t
r_fmt
;
format_t
r_fmt
;
// Pointer to dtb that is appended after kernel
// Pointer to dtb that is appended after kernel
void
*
dtb
;
uint8_t
*
dtb
;
uint32_t
dt_size
;
uint32_t
dt_size
;
// Pointer to end of image
// Pointer to end of image
void
*
tail
;
uint8_t
*
tail
;
size_t
tail_size
;
size_t
tail_size
;
// Pointers to blocks defined in header
// Pointers to blocks defined in header
void
*
kernel
;
uint8_t
*
kernel
;
void
*
ramdisk
;
uint8_t
*
ramdisk
;
void
*
second
;
uint8_t
*
second
;
void
*
extra
;
uint8_t
*
extra
;
}
boot_img
;
uint8_t
*
recov_dtbo
;
~
boot_img
();
int
parse_image
(
const
char
*
);
void
find_dtb
();
void
print_hdr
();
/* Access elements in header */
#define IS_PXA (flags & PXA_FLAG)
#define dyn_access(x) (IS_PXA ? \
static_cast<boot_img_hdr_pxa *>(hdr)->x : \
static_cast<boot_img_hdr_v1 *>(hdr)->x)
#define dyn_get(x, t) t x() const { return dyn_access(x); }
#define dyn_set(x, t) void x(t v) { dyn_access(x) = v; }
#define hdr_get(x, t) t x() const { return IS_PXA ? 0 : static_cast<boot_img_hdr *>(hdr)->x; }
#define hdr_set(x, t) void x(t v) { if (!IS_PXA) static_cast<boot_img_hdr *>(hdr)->x = v; }
dyn_set
(
extra_size
,
uint32_t
);
dyn_get
(
page_size
,
uint32_t
);
dyn_get
(
name
,
char
*
);
dyn_get
(
cmdline
,
char
*
);
dyn_get
(
id
,
char
*
);
hdr_get
(
os_version
,
uint32_t
);
hdr_get
(
recovery_dtbo_size
,
uint32_t
);
hdr_set
(
recovery_dtbo_size
,
uint32_t
);
hdr_get
(
recovery_dtbo_offset
,
uint32_t
);
hdr_set
(
recovery_dtbo_offset
,
uint32_t
);
uint32_t
header_version
()
{
if
(
IS_PXA
)
return
0
;
uint32_t
ver
=
static_cast
<
boot_img_hdr
*>
(
hdr
)
->
header_version
;
// There won't be v4 header any time soon...
// If larger than 4, assume this field will be treated as extra_size
return
ver
>
4
?
0
:
ver
;
}
uint32_t
extra_size
()
{
// If header version > 0, we should treat this field as header_version
return
header_version
()
?
0
:
dyn_access
(
extra_size
);
}
size_t
hdr_size
()
{
return
IS_PXA
?
sizeof
(
boot_img_hdr_pxa
)
:
sizeof
(
boot_img_hdr
);
}
};
#endif
#endif
native/jni/magiskboot/format.c
View file @
74aae523
#include <string.h>
#include <string.h>
#include "bootimg.h"
#include "format.h"
#include "format.h"
#define MATCH(s) (len >= (sizeof(s) - 1) && memcmp(buf, s, sizeof(s) - 1) == 0)
#define MATCH(s) (len >= (sizeof(s) - 1) && memcmp(buf, s, sizeof(s) - 1) == 0)
...
...
native/jni/magiskboot/magiskboot.h
View file @
74aae523
...
@@ -4,20 +4,20 @@
...
@@ -4,20 +4,20 @@
#include <sys/types.h>
#include <sys/types.h>
#include "logging.h"
#include "logging.h"
#include "
bootimg
.h"
#include "
format
.h"
#define KERNEL_FILE "kernel"
#define KERNEL_FILE "kernel"
#define RAMDISK_FILE "ramdisk.cpio"
#define RAMDISK_FILE "ramdisk.cpio"
#define SECOND_FILE "second"
#define SECOND_FILE "second"
#define EXTRA_FILE "extra"
#define EXTRA_FILE "extra"
#define DTB_FILE "dtb"
#define DTB_FILE "dtb"
#define RECV_DTBO_FILE "recovery_dtbo"
#define NEW_BOOT "new-boot.img"
#define NEW_BOOT "new-boot.img"
// Main entries
// Main entries
int
unpack
(
const
char
*
image
);
int
unpack
(
const
char
*
image
);
void
repack
(
const
char
*
orig_image
,
const
char
*
out_image
);
void
repack
(
const
char
*
orig_image
,
const
char
*
out_image
);
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
);
void
hexpatch
(
const
char
*
image
,
const
char
*
from
,
const
char
*
to
);
int
parse_img
(
const
char
*
image
,
boot_img
*
boot
);
int
cpio_commands
(
int
argc
,
char
*
argv
[]);
int
cpio_commands
(
int
argc
,
char
*
argv
[]);
void
comp_file
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
);
void
comp_file
(
const
char
*
method
,
const
char
*
from
,
const
char
*
to
);
void
decomp_file
(
char
*
from
,
const
char
*
to
);
void
decomp_file
(
char
*
from
,
const
char
*
to
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment