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
439d497a
Commit
439d497a
authored
May 08, 2021
by
vvb2060
Committed by
John Wu
Aug 29, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
boot image header v4
parent
05809326
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
128 additions
and
4 deletions
+128
-4
bootimg.cpp
native/jni/magiskboot/bootimg.cpp
+12
-1
bootimg.hpp
native/jni/magiskboot/bootimg.hpp
+116
-3
No files found.
native/jni/magiskboot/bootimg.cpp
View file @
439d497a
...
@@ -247,7 +247,15 @@ void boot_img::parse_image(uint8_t *addr, format_t type) {
...
@@ -247,7 +247,15 @@ 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
(
type
==
AOSP_VENDOR
)
{
if
(
type
==
AOSP_VENDOR
)
{
fprintf
(
stderr
,
"VENDOR_BOOT_HDR
\n
"
);
fprintf
(
stderr
,
"VENDOR_BOOT_HDR
\n
"
);
hdr
=
new
dyn_img_vnd_v3
(
addr
);
switch
(
hp
->
header_version
)
{
case
4
:
hdr
=
new
dyn_img_vnd_v4
(
addr
);
break
;
case
3
:
default
:
hdr
=
new
dyn_img_vnd_v3
(
addr
);
break
;
}
}
else
if
(
hp
->
page_size
>=
0x02000000
)
{
}
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
);
...
@@ -276,6 +284,9 @@ void boot_img::parse_image(uint8_t *addr, format_t type) {
...
@@ -276,6 +284,9 @@ void boot_img::parse_image(uint8_t *addr, format_t type) {
case
3
:
case
3
:
hdr
=
new
dyn_img_v3
(
addr
);
hdr
=
new
dyn_img_v3
(
addr
);
break
;
break
;
case
4
:
hdr
=
new
dyn_img_v4
(
addr
);
break
;
default
:
default
:
hdr
=
new
dyn_img_v0
(
addr
);
hdr
=
new
dyn_img_v0
(
addr
);
break
;
break
;
...
...
native/jni/magiskboot/bootimg.hpp
View file @
439d497a
...
@@ -104,6 +104,8 @@ struct AvbVBMetaImageHeader {
...
@@ -104,6 +104,8 @@ struct AvbVBMetaImageHeader {
#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
#define VENDOR_BOOT_ARGS_SIZE 2048
#define VENDOR_RAMDISK_NAME_SIZE 32
#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
/*
/*
* +-----------------+
* +-----------------+
...
@@ -261,6 +263,101 @@ struct boot_img_hdr_vnd_v3 {
...
@@ -261,6 +263,101 @@ struct boot_img_hdr_vnd_v3 {
uint64_t
dtb_addr
;
/* physical load address for DTB image */
uint64_t
dtb_addr
;
/* physical load address for DTB image */
}
__attribute__
((
packed
));
}
__attribute__
((
packed
));
/* When the boot image header has a version of 4, the structure of the boot
* image is as follows:
*
* +---------------------+
* | boot header | 4096 bytes
* +---------------------+
* | kernel | m pages
* +---------------------+
* | ramdisk | n pages
* +---------------------+
* | boot signature | g pages
* +---------------------+
*
* m = (kernel_size + 4096 - 1) / 4096
* n = (ramdisk_size + 4096 - 1) / 4096
* g = (signature_size + 4096 - 1) / 4096
*
* Note that in version 4 of the boot image header, page size is fixed at 4096
* bytes.
*
* The structure of the vendor boot image version 4, which is required to be
* present when a version 4 boot image is used, is as follows:
*
* +------------------------+
* | vendor boot header | o pages
* +------------------------+
* | vendor ramdisk section | p pages
* +------------------------+
* | dtb | q pages
* +------------------------+
* | vendor ramdisk table | r pages
* +------------------------+
* | bootconfig | s pages
* +------------------------+
*
* o = (2128 + page_size - 1) / page_size
* p = (vendor_ramdisk_size + page_size - 1) / page_size
* q = (dtb_size + page_size - 1) / page_size
* r = (vendor_ramdisk_table_size + page_size - 1) / page_size
* s = (vendor_bootconfig_size + page_size - 1) / page_size
*
* Note that in version 4 of the vendor boot image, multiple vendor ramdisks can
* be included in the vendor boot image. The bootloader can select a subset of
* ramdisks to load at runtime. To help the bootloader select the ramdisks, each
* ramdisk is tagged with a type tag and a set of hardware identifiers
* describing the board, soc or platform that this ramdisk is intended for.
*
* The vendor ramdisk section is consist of multiple ramdisk images concatenated
* one after another, and vendor_ramdisk_size is the size of the section, which
* is the total size of all the ramdisks included in the vendor boot image.
*
* The vendor ramdisk table holds the size, offset, type, name and hardware
* identifiers of each ramdisk. The type field denotes the type of its content.
* The vendor ramdisk names are unique. The hardware identifiers are specified
* in the board_id field in each table entry. The board_id field is consist of a
* vector of unsigned integer words, and the encoding scheme is defined by the
* hardware vendor.
*
* For the different type of ramdisks, there are:
* - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified.
* - VENDOR_RAMDISK_TYPE_PLATFORM ramdisks contain platform specific bits, so
* the bootloader should always load these into memory.
* - VENDOR_RAMDISK_TYPE_RECOVERY ramdisks contain recovery resources, so
* the bootloader should load these when booting into recovery.
* - VENDOR_RAMDISK_TYPE_DLKM ramdisks contain dynamic loadable kernel
* modules.
*
* Version 4 of the vendor boot image also adds a bootconfig section to the end
* of the image. This section contains Boot Configuration parameters known at
* build time. The bootloader is responsible for placing this section directly
* after the generic ramdisk, followed by the bootconfig trailer, before
* entering the kernel.
*/
struct
boot_img_hdr_v4
:
public
boot_img_hdr_v3
{
uint32_t
signature_size
;
/* size in bytes */
}
__attribute__
((
packed
));
struct
boot_img_hdr_vnd_v4
:
public
boot_img_hdr_vnd_v3
{
uint32_t
vendor_ramdisk_table_size
;
/* size in bytes for the vendor ramdisk table */
uint32_t
vendor_ramdisk_table_entry_num
;
/* number of entries in the vendor ramdisk table */
uint32_t
vendor_ramdisk_table_entry_size
;
/* size in bytes for a vendor ramdisk table entry */
uint32_t
bootconfig_size
;
/* size in bytes for the bootconfig section */
}
__attribute__
((
packed
));
struct
vendor_ramdisk_table_entry_v4
{
uint32_t
ramdisk_size
;
/* size in bytes for the ramdisk image */
uint32_t
ramdisk_offset
;
/* offset to the ramdisk image in vendor ramdisk section */
uint32_t
ramdisk_type
;
/* type of the ramdisk */
uint8_t
ramdisk_name
[
VENDOR_RAMDISK_NAME_SIZE
];
/* asciiz ramdisk name */
// Hardware identifiers describing the board, soc or platform which this
// ramdisk is intended to be loaded on.
uint32_t
board_id
[
VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE
];
}
__attribute__
((
packed
));
/*******************************
/*******************************
* Polymorphic Universal Header
* Polymorphic Universal Header
*******************************/
*******************************/
...
@@ -310,8 +407,10 @@ protected:
...
@@ -310,8 +407,10 @@ protected:
// Main header could be either AOSP or PXA
// Main header could be either AOSP or PXA
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_v4
*
v4_hdr
;
/* AOSP v4 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 */
boot_img_hdr_vnd_v3
*
v3_vnd
;
/* AOSP vendor v3 header */
boot_img_hdr_vnd_v4
*
v4_vnd
;
/* AOSP vendor v4 header */
void
*
raw
;
/* Raw pointer */
void
*
raw
;
/* Raw pointer */
};
};
...
@@ -415,7 +514,7 @@ private:
...
@@ -415,7 +514,7 @@ private:
};
};
#undef impl_val
#undef impl_val
#define impl_val(name) __impl_val(name, vnd)
#define impl_val(name) __impl_val(name, v
3_v
nd)
struct
dyn_img_vnd_v3
:
public
dyn_img_hdr
{
struct
dyn_img_vnd_v3
:
public
dyn_img_hdr
{
impl_cls
(
vnd_v3
)
impl_cls
(
vnd_v3
)
...
@@ -431,7 +530,21 @@ struct dyn_img_vnd_v3 : public dyn_img_hdr {
...
@@ -431,7 +530,21 @@ struct dyn_img_vnd_v3 : public dyn_img_hdr {
size_t
hdr_space
()
override
{
auto
sz
=
page_size
();
return
do_align
(
hdr_size
(),
sz
);
}
size_t
hdr_space
()
override
{
auto
sz
=
page_size
();
return
do_align
(
hdr_size
(),
sz
);
}
// Make API compatible
// Make API compatible
char
*
extra_cmdline
()
override
{
return
&
vnd
->
cmdline
[
BOOT_ARGS_SIZE
];
}
char
*
extra_cmdline
()
override
{
return
&
v3_vnd
->
cmdline
[
BOOT_ARGS_SIZE
];
}
};
#undef impl_val
#define impl_val(name) __impl_val(name, v4_hdr)
struct
dyn_img_v4
:
public
dyn_img_v3
{
impl_cls
(
v4
)
};
#undef impl_val
#define impl_val(name) __impl_val(name, v4_vnd)
struct
dyn_img_vnd_v4
:
public
dyn_img_vnd_v3
{
impl_cls
(
vnd_v4
)
};
};
#undef __impl_cls
#undef __impl_cls
...
...
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