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
29062484
Commit
29062484
authored
Jan 31, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reorganize dtb code
parent
497efc9f
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
40 additions
and
33 deletions
+40
-33
dtb.cpp
native/jni/magiskboot/dtb.cpp
+40
-33
No files found.
native/jni/magiskboot/dtb.cpp
View file @
29062484
...
@@ -192,7 +192,7 @@ static bool fdt_patch(Iter first, Iter last) {
...
@@ -192,7 +192,7 @@ static bool fdt_patch(Iter first, Iter last) {
}
}
template
<
class
Table
,
class
Header
>
template
<
class
Table
,
class
Header
>
static
int
dt
b_patch
(
const
Header
*
hdr
,
const
char
*
in
,
const
char
*
out
)
{
static
int
dt
_table_patch
(
const
Header
*
hdr
,
const
char
*
out
)
{
map
<
uint32_t
,
fdt_blob
>
dtb_map
;
map
<
uint32_t
,
fdt_blob
>
dtb_map
;
auto
buf
=
reinterpret_cast
<
const
uint8_t
*>
(
hdr
);
auto
buf
=
reinterpret_cast
<
const
uint8_t
*>
(
hdr
);
auto
tables
=
reinterpret_cast
<
const
Table
*>
(
hdr
+
1
);
auto
tables
=
reinterpret_cast
<
const
Table
*>
(
hdr
+
1
);
...
@@ -229,9 +229,8 @@ static int dtb_patch(const Header *hdr, const char *in, const char *out) {
...
@@ -229,9 +229,8 @@ static int dtb_patch(const Header *hdr, const char *in, const char *out) {
if
(
!
fdt_patch
(
make_iter
(
dtb_map
.
begin
()),
make_iter
(
dtb_map
.
end
())))
if
(
!
fdt_patch
(
make_iter
(
dtb_map
.
begin
()),
make_iter
(
dtb_map
.
end
())))
return
1
;
return
1
;
if
(
out
==
in
)
unlink
(
out
);
unlink
(
in
);
int
fd
=
xopen
(
out
,
O_RDWR
|
O_CREAT
|
O_CLOEXEC
,
0644
);
int
fd
=
xopen
(
out
,
O_RDWR
|
O_CREAT
|
O_TRUNC
|
O_CLOEXEC
,
0644
);
uint32_t
total_size
=
0
;
uint32_t
total_size
=
0
;
...
@@ -282,6 +281,34 @@ static int dtb_patch(const Header *hdr, const char *in, const char *out) {
...
@@ -282,6 +281,34 @@ static int dtb_patch(const Header *hdr, const char *in, const char *out) {
return
0
;
return
0
;
}
}
static
int
blob_patch
(
uint8_t
*
dtb
,
size_t
dtb_sz
,
const
char
*
out
)
{
vector
<
uint8_t
*>
fdt_list
;
for
(
int
i
=
0
;
i
<
dtb_sz
;
++
i
)
{
if
(
memcmp
(
dtb
+
i
,
FDT_MAGIC_STR
,
4
)
==
0
)
{
int
len
=
fdt_totalsize
(
dtb
+
i
);
auto
fdt
=
static_cast
<
uint8_t
*>
(
xmalloc
(
len
+
256
));
memcpy
(
fdt
,
dtb
+
i
,
len
);
fdt_open_into
(
fdt
,
fdt
,
len
+
256
);
fdt_list
.
push_back
(
fdt
);
i
+=
len
-
1
;
}
}
if
(
!
fdt_patch
(
fdt_list
.
begin
(),
fdt_list
.
end
()))
return
1
;
unlink
(
out
);
int
fd
=
xopen
(
out
,
O_WRONLY
|
O_CREAT
|
O_CLOEXEC
,
0644
);
for
(
auto
fdt
:
fdt_list
)
{
fdt_pack
(
fdt
);
xwrite
(
fd
,
fdt
,
fdt_totalsize
(
fdt
));
free
(
fdt
);
}
close
(
fd
);
return
0
;
}
#define MATCH(s) (memcmp(dtb, s, sizeof(s) - 1) == 0)
#define MATCH(s) (memcmp(dtb, s, sizeof(s) - 1) == 0)
static
int
dtb_patch
(
const
char
*
in
,
const
char
*
out
)
{
static
int
dtb_patch
(
const
char
*
in
,
const
char
*
out
)
{
...
@@ -298,13 +325,13 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -298,13 +325,13 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
1
:
case
1
:
fprintf
(
stderr
,
"QCDT v1
\n
"
);
fprintf
(
stderr
,
"QCDT v1
\n
"
);
return
dt
b_patch
<
qctable_v1
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
qctable_v1
>
(
hdr
,
out
);
case
2
:
case
2
:
fprintf
(
stderr
,
"QCDT v2
\n
"
);
fprintf
(
stderr
,
"QCDT v2
\n
"
);
return
dt
b_patch
<
qctable_v2
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
qctable_v2
>
(
hdr
,
out
);
case
3
:
case
3
:
fprintf
(
stderr
,
"QCDT v3
\n
"
);
fprintf
(
stderr
,
"QCDT v3
\n
"
);
return
dt
b_patch
<
qctable_v3
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
qctable_v3
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
...
@@ -313,7 +340,7 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -313,7 +340,7 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
2
:
case
2
:
fprintf
(
stderr
,
"DTBH v2
\n
"
);
fprintf
(
stderr
,
"DTBH v2
\n
"
);
return
dt
b_patch
<
bhtable_v2
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
bhtable_v2
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
...
@@ -322,7 +349,7 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -322,7 +349,7 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
1
:
case
1
:
fprintf
(
stderr
,
"PXA-DT v1
\n
"
);
fprintf
(
stderr
,
"PXA-DT v1
\n
"
);
return
dt
b_patch
<
pxatable_v1
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
pxatable_v1
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
...
@@ -331,7 +358,7 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -331,7 +358,7 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
1
:
case
1
:
fprintf
(
stderr
,
"PXA-19xx v1
\n
"
);
fprintf
(
stderr
,
"PXA-19xx v1
\n
"
);
return
dt
b_patch
<
pxatable_v1
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
pxatable_v1
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
...
@@ -340,7 +367,7 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -340,7 +367,7 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
1
:
case
1
:
fprintf
(
stderr
,
"SPRD v1
\n
"
);
fprintf
(
stderr
,
"SPRD v1
\n
"
);
return
dt
b_patch
<
sprdtable_v1
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
sprdtable_v1
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
...
@@ -349,33 +376,13 @@ static int dtb_patch(const char *in, const char *out) {
...
@@ -349,33 +376,13 @@ static int dtb_patch(const char *in, const char *out) {
switch
(
hdr
->
version
)
{
switch
(
hdr
->
version
)
{
case
0
:
case
0
:
fprintf
(
stderr
,
"DT_TABLE v0
\n
"
);
fprintf
(
stderr
,
"DT_TABLE v0
\n
"
);
return
dt
b_patch
<
dt_table_entry
>
(
hdr
,
in
,
out
);
return
dt
_table_patch
<
dt_table_entry
>
(
hdr
,
out
);
default
:
default
:
return
1
;
return
1
;
}
}
}
else
{
}
else
{
vector
<
uint8_t
*>
fdt_list
;
return
blob_patch
(
dtb
,
dtb_sz
,
out
);
for
(
int
i
=
0
;
i
<
dtb_sz
;
++
i
)
{
if
(
memcmp
(
dtb
+
i
,
FDT_MAGIC_STR
,
4
)
==
0
)
{
int
len
=
fdt_totalsize
(
dtb
+
i
);
auto
fdt
=
static_cast
<
uint8_t
*>
(
xmalloc
(
len
+
256
));
memcpy
(
fdt
,
dtb
+
i
,
len
);
fdt_open_into
(
fdt
,
fdt
,
len
+
256
);
fdt_list
.
push_back
(
fdt
);
i
+=
len
-
1
;
}
}
if
(
!
fdt_patch
(
fdt_list
.
begin
(),
fdt_list
.
end
()))
return
1
;
int
fd
=
xopen
(
out
,
O_WRONLY
|
O_CREAT
|
O_TRUNC
|
O_CLOEXEC
,
0644
);
for
(
auto
fdt
:
fdt_list
)
{
fdt_pack
(
fdt
);
xwrite
(
fd
,
fdt
,
fdt_totalsize
(
fdt
));
free
(
fdt
);
}
close
(
fd
);
}
}
return
0
;
}
}
int
dtb_commands
(
int
argc
,
char
*
argv
[])
{
int
dtb_commands
(
int
argc
,
char
*
argv
[])
{
...
...
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