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
0632b146
Commit
0632b146
authored
Oct 25, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add vendor boot image support to magiskboot
parent
1b0b1807
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
74 additions
and
19 deletions
+74
-19
bootimg.cpp
native/jni/magiskboot/bootimg.cpp
+9
-4
bootimg.hpp
native/jni/magiskboot/bootimg.hpp
+61
-9
format.cpp
native/jni/magiskboot/format.cpp
+2
-6
format.hpp
native/jni/magiskboot/format.hpp
+2
-0
No files found.
native/jni/magiskboot/bootimg.cpp
View file @
0632b146
...
@@ -162,7 +162,8 @@ boot_img::boot_img(const char *image) {
...
@@ -162,7 +162,8 @@ boot_img::boot_img(const char *image) {
mmap_ro
(
image
,
map_addr
,
map_size
);
mmap_ro
(
image
,
map_addr
,
map_size
);
fprintf
(
stderr
,
"Parsing boot image: [%s]
\n
"
,
image
);
fprintf
(
stderr
,
"Parsing boot image: [%s]
\n
"
,
image
);
for
(
uint8_t
*
addr
=
map_addr
;
addr
<
map_addr
+
map_size
;
++
addr
)
{
for
(
uint8_t
*
addr
=
map_addr
;
addr
<
map_addr
+
map_size
;
++
addr
)
{
switch
(
check_fmt
(
addr
,
map_size
))
{
format_t
fmt
=
check_fmt
(
addr
,
map_size
);
switch
(
fmt
)
{
case
CHROMEOS
:
case
CHROMEOS
:
// chromeos require external signing
// chromeos require external signing
flags
|=
CHROMEOS_FLAG
;
flags
|=
CHROMEOS_FLAG
;
...
@@ -179,7 +180,8 @@ boot_img::boot_img(const char *image) {
...
@@ -179,7 +180,8 @@ boot_img::boot_img(const char *image) {
addr
+=
sizeof
(
blob_hdr
)
-
1
;
addr
+=
sizeof
(
blob_hdr
)
-
1
;
break
;
break
;
case
AOSP
:
case
AOSP
:
parse_image
(
addr
);
case
AOSP_VENDOR
:
parse_image
(
addr
,
fmt
);
return
;
return
;
default
:
default
:
break
;
break
;
...
@@ -242,9 +244,12 @@ off += hdr->name##_size(); \
...
@@ -242,9 +244,12 @@ off += hdr->name##_size(); \
off = do_align(off, hdr->page_size()); \
off = do_align(off, hdr->page_size()); \
}
}
void
boot_img
::
parse_image
(
uint8_t
*
addr
)
{
void
boot_img
::
parse_image
(
uint8_t
*
addr
,
format_t
type
)
{
auto
hp
=
reinterpret_cast
<
boot_img_hdr
*>
(
addr
);
auto
hp
=
reinterpret_cast
<
boot_img_hdr
*>
(
addr
);
if
(
hp
->
page_size
>=
0x02000000
)
{
if
(
type
==
AOSP_VENDOR
)
{
fprintf
(
stderr
,
"VENDOR_BOOT_HDR
\n
"
);
hdr
=
new
dyn_img_vnd_v3
(
addr
);
}
else
if
(
hp
->
page_size
>=
0x02000000
)
{
fprintf
(
stderr
,
"PXA_BOOT_HDR
\n
"
);
fprintf
(
stderr
,
"PXA_BOOT_HDR
\n
"
);
hdr
=
new
dyn_img_pxa
(
addr
);
hdr
=
new
dyn_img_pxa
(
addr
);
}
else
{
}
else
{
...
...
native/jni/magiskboot/bootimg.hpp
View file @
0632b146
...
@@ -50,6 +50,7 @@ struct blob_hdr {
...
@@ -50,6 +50,7 @@ struct blob_hdr {
#define BOOT_ID_SIZE 32
#define BOOT_ID_SIZE 32
#define BOOT_ARGS_SIZE 512
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
#define BOOT_EXTRA_ARGS_SIZE 1024
#define VENDOR_BOOT_ARGS_SIZE 2048
/*
/*
* +-----------------+
* +-----------------+
...
@@ -159,6 +160,21 @@ struct boot_img_hdr_pxa : public boot_img_hdr_common {
...
@@ -159,6 +160,21 @@ struct boot_img_hdr_pxa : public boot_img_hdr_common {
* n = (ramdisk_size + 4096 - 1) / 4096
* n = (ramdisk_size + 4096 - 1) / 4096
*
*
* Note that in version 3 of the boot image header, page size is fixed at 4096 bytes.
* Note that in version 3 of the boot image header, page size is fixed at 4096 bytes.
*
* The structure of the vendor boot image (introduced with version 3 and
* required to be present when a v3 boot image is used) is as follows:
*
* +---------------------+
* | vendor boot header | o pages
* +---------------------+
* | vendor ramdisk | p pages
* +---------------------+
* | dtb | q pages
* +---------------------+
*
* o = (2112 + page_size - 1) / page_size
* p = (ramdisk_size + page_size - 1) / page_size
* q = (dtb_size + page_size - 1) / page_size
*/
*/
struct
boot_img_hdr_v3
{
struct
boot_img_hdr_v3
{
...
@@ -175,6 +191,23 @@ struct boot_img_hdr_v3 {
...
@@ -175,6 +191,23 @@ struct boot_img_hdr_v3 {
char
cmdline
[
BOOT_ARGS_SIZE
+
BOOT_EXTRA_ARGS_SIZE
];
char
cmdline
[
BOOT_ARGS_SIZE
+
BOOT_EXTRA_ARGS_SIZE
];
}
__attribute__
((
packed
));
}
__attribute__
((
packed
));
struct
boot_img_hdr_vnd_v3
{
// Must be VENDOR_BOOT_MAGIC.
uint8_t
magic
[
BOOT_MAGIC_SIZE
];
// Version of the vendor boot image header.
uint32_t
header_version
;
uint32_t
page_size
;
/* flash page size we assume */
uint32_t
kernel_addr
;
/* physical load addr */
uint32_t
ramdisk_addr
;
/* physical load addr */
uint32_t
ramdisk_size
;
/* size in bytes */
char
cmdline
[
VENDOR_BOOT_ARGS_SIZE
];
uint32_t
tags_addr
;
/* physical addr for kernel tags (if required) */
char
name
[
BOOT_NAME_SIZE
];
/* asciiz product name */
uint32_t
header_size
;
uint32_t
dtb_size
;
/* size in bytes for DTB image */
uint64_t
dtb_addr
;
/* physical load address for DTB image */
}
__attribute__
((
packed
));
/*******************************
/*******************************
* Polymorphic Universal Header
* Polymorphic Universal Header
*******************************/
*******************************/
...
@@ -222,6 +255,7 @@ protected:
...
@@ -222,6 +255,7 @@ protected:
boot_img_hdr_v2
*
v2_hdr
;
/* AOSP v2 header */
boot_img_hdr_v2
*
v2_hdr
;
/* AOSP v2 header */
boot_img_hdr_v3
*
v3_hdr
;
/* AOSP v3 header */
boot_img_hdr_v3
*
v3_hdr
;
/* AOSP v3 header */
boot_img_hdr_pxa
*
hdr_pxa
;
/* Samsung PXA header */
boot_img_hdr_pxa
*
hdr_pxa
;
/* Samsung PXA header */
boot_img_hdr_vnd_v3
*
vnd
;
/* AOSP vendor v3 header */
void
*
raw
;
/* Raw pointer */
void
*
raw
;
/* Raw pointer */
};
};
...
@@ -243,10 +277,11 @@ name(void *ptr) { \
...
@@ -243,10 +277,11 @@ name(void *ptr) { \
} \
} \
size_t hdr_size() override { return sizeof(hdr); }
size_t hdr_size() override { return sizeof(hdr); }
#define impl_cls(ver) __impl_cls(dyn_img_##ver, boot_img_hdr_##ver)
#define __impl_val(name, hdr_name) \
decltype(std::declval<dyn_img_hdr>().name()) name() override { return hdr_name->name; }
#define impl_
val(name) \
#define impl_
cls(ver) __impl_cls(dyn_img_##ver, boot_img_hdr_##ver)
decltype(std::declval<dyn_img_hdr>().name()) name() override { return v2_hdr->name; }
#define impl_val(name) __impl_val(name, v2_hdr)
struct
dyn_img_common
:
public
dyn_img_hdr
{
struct
dyn_img_common
:
public
dyn_img_hdr
{
impl_val
(
kernel_size
)
impl_val
(
kernel_size
)
...
@@ -284,8 +319,7 @@ struct dyn_img_v2 : public dyn_img_v1 {
...
@@ -284,8 +319,7 @@ struct dyn_img_v2 : public dyn_img_v1 {
};
};
#undef impl_val
#undef impl_val
#define impl_val(name) \
#define impl_val(name) __impl_val(name, hdr_pxa)
decltype(std::declval<dyn_img_hdr>().name()) name() override { return hdr_pxa->name; }
struct
dyn_img_pxa
:
public
dyn_img_common
{
struct
dyn_img_pxa
:
public
dyn_img_common
{
impl_cls
(
pxa
)
impl_cls
(
pxa
)
...
@@ -299,8 +333,7 @@ struct dyn_img_pxa : public dyn_img_common {
...
@@ -299,8 +333,7 @@ struct dyn_img_pxa : public dyn_img_common {
};
};
#undef impl_val
#undef impl_val
#define impl_val(name) \
#define impl_val(name) __impl_val(name, v3_hdr)
decltype(std::declval<dyn_img_hdr>().name()) name() override { return v3_hdr->name; }
struct
dyn_img_v3
:
public
dyn_img_hdr
{
struct
dyn_img_v3
:
public
dyn_img_hdr
{
impl_cls
(
v3
)
impl_cls
(
v3
)
...
@@ -320,7 +353,26 @@ private:
...
@@ -320,7 +353,26 @@ private:
uint32_t
page_sz
;
uint32_t
page_sz
;
};
};
#undef impl_val
#define impl_val(name) __impl_val(name, vnd)
struct
dyn_img_vnd_v3
:
public
dyn_img_hdr
{
impl_cls
(
vnd_v3
)
impl_val
(
header_version
)
impl_val
(
page_size
)
impl_val
(
ramdisk_size
)
impl_val
(
cmdline
)
impl_val
(
name
)
impl_val
(
header_size
)
impl_val
(
dtb_size
)
// Make API compatible
char
*
extra_cmdline
()
override
{
return
&
vnd
->
cmdline
[
BOOT_ARGS_SIZE
];
}
};
#undef __impl_cls
#undef __impl_cls
#undef __impl_val
#undef impl_cls
#undef impl_cls
#undef impl_val
#undef impl_val
...
@@ -363,7 +415,7 @@ struct boot_img {
...
@@ -363,7 +415,7 @@ struct boot_img {
mtk_hdr
*
k_hdr
;
mtk_hdr
*
k_hdr
;
mtk_hdr
*
r_hdr
;
mtk_hdr
*
r_hdr
;
// Pointer to dtb that is
appended after
kernel
// Pointer to dtb that is
embedded in
kernel
uint8_t
*
kernel_dtb
;
uint8_t
*
kernel_dtb
;
uint32_t
kernel_dt_size
=
0
;
uint32_t
kernel_dt_size
=
0
;
...
@@ -383,5 +435,5 @@ struct boot_img {
...
@@ -383,5 +435,5 @@ struct boot_img {
boot_img
(
const
char
*
);
boot_img
(
const
char
*
);
~
boot_img
();
~
boot_img
();
void
parse_image
(
uint8_t
*
addr
);
void
parse_image
(
uint8_t
*
addr
,
format_t
type
);
};
};
native/jni/magiskboot/format.cpp
View file @
0632b146
...
@@ -28,6 +28,8 @@ format_t check_fmt(const void *buf, size_t len) {
...
@@ -28,6 +28,8 @@ format_t check_fmt(const void *buf, size_t len) {
return
CHROMEOS
;
return
CHROMEOS
;
}
else
if
(
MATCH
(
BOOT_MAGIC
))
{
}
else
if
(
MATCH
(
BOOT_MAGIC
))
{
return
AOSP
;
return
AOSP
;
}
else
if
(
MATCH
(
VENDOR_BOOT_MAGIC
))
{
return
AOSP_VENDOR
;
}
else
if
(
MATCH
(
GZIP1_MAGIC
)
||
MATCH
(
GZIP2_MAGIC
))
{
}
else
if
(
MATCH
(
GZIP1_MAGIC
)
||
MATCH
(
GZIP2_MAGIC
))
{
return
GZIP
;
return
GZIP
;
}
else
if
(
MATCH
(
LZOP_MAGIC
))
{
}
else
if
(
MATCH
(
LZOP_MAGIC
))
{
...
@@ -58,10 +60,6 @@ format_t check_fmt(const void *buf, size_t len) {
...
@@ -58,10 +60,6 @@ format_t check_fmt(const void *buf, size_t len) {
const
char
*
Fmt2Name
::
operator
[](
format_t
fmt
)
{
const
char
*
Fmt2Name
::
operator
[](
format_t
fmt
)
{
switch
(
fmt
)
{
switch
(
fmt
)
{
case
CHROMEOS
:
return
"chromeos"
;
case
AOSP
:
return
"aosp"
;
case
GZIP
:
case
GZIP
:
return
"gzip"
;
return
"gzip"
;
case
LZOP
:
case
LZOP
:
...
@@ -78,8 +76,6 @@ const char *Fmt2Name::operator[](format_t fmt) {
...
@@ -78,8 +76,6 @@ const char *Fmt2Name::operator[](format_t fmt) {
return
"lz4_legacy"
;
return
"lz4_legacy"
;
case
LZ4_LG
:
case
LZ4_LG
:
return
"lz4_lg"
;
return
"lz4_lg"
;
case
MTK
:
return
"mtk"
;
case
DTB
:
case
DTB
:
return
"dtb"
;
return
"dtb"
;
default
:
default
:
...
...
native/jni/magiskboot/format.hpp
View file @
0632b146
...
@@ -8,6 +8,7 @@ typedef enum {
...
@@ -8,6 +8,7 @@ typedef enum {
/* Boot formats */
/* Boot formats */
CHROMEOS
,
CHROMEOS
,
AOSP
,
AOSP
,
AOSP_VENDOR
,
DHTB
,
DHTB
,
BLOB
,
BLOB
,
/* Compression formats */
/* Compression formats */
...
@@ -29,6 +30,7 @@ typedef enum {
...
@@ -29,6 +30,7 @@ typedef enum {
#define COMPRESSED_ANY(fmt) ((fmt) >= GZIP && (fmt) <= LZOP)
#define COMPRESSED_ANY(fmt) ((fmt) >= GZIP && (fmt) <= LZOP)
#define BOOT_MAGIC "ANDROID!"
#define BOOT_MAGIC "ANDROID!"
#define VENDOR_BOOT_MAGIC "VNDRBOOT"
#define CHROMEOS_MAGIC "CHROMEOS"
#define CHROMEOS_MAGIC "CHROMEOS"
#define GZIP1_MAGIC "\x1f\x8b"
#define GZIP1_MAGIC "\x1f\x8b"
#define GZIP2_MAGIC "\x1f\x9e"
#define GZIP2_MAGIC "\x1f\x9e"
...
...
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