Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
b29dec5c
Commit
b29dec5c
authored
Apr 28, 2021
by
Mark Dykes
Committed by
TrustedFirmware Code Review
Apr 28, 2021
Browse files
Merge "feat(fdt): introduce wrapper function to read DT UUIDs" into integration
parents
2ba56793
d13dbb6f
Changes
4
Show whitespace changes
Inline
Side-by-side
common/fdt_wrappers.c
View file @
b29dec5c
/*
* Copyright (c) 2018-202
0
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2018-202
1
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -7,12 +7,14 @@
/* Helper functions to offer easier navigation of Device Tree Blob */
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <libfdt.h>
#include <common/debug.h>
#include <common/fdt_wrappers.h>
#include <common/uuid.h>
/*
* Read cells from a given property of the given node. Any number of 32-bit
...
...
@@ -151,6 +153,39 @@ int fdtw_read_string(const void *dtb, int node, const char *prop,
return
0
;
}
/*
* Read UUID from a given property of the given node. Returns 0 on success,
* and a negative value upon error.
*/
int
fdtw_read_uuid
(
const
void
*
dtb
,
int
node
,
const
char
*
prop
,
unsigned
int
length
,
uint8_t
*
uuid
)
{
/* Buffer for UUID string (plus NUL terminator) */
char
uuid_string
[
UUID_STRING_LENGTH
+
1U
];
int
err
;
assert
(
dtb
!=
NULL
);
assert
(
prop
!=
NULL
);
assert
(
uuid
!=
NULL
);
assert
(
node
>=
0
);
if
(
length
<
UUID_BYTES_LENGTH
)
{
return
-
EINVAL
;
}
err
=
fdtw_read_string
(
dtb
,
node
,
prop
,
uuid_string
,
UUID_STRING_LENGTH
+
1U
);
if
(
err
!=
0
)
{
return
err
;
}
if
(
read_uuid
(
uuid
,
uuid_string
)
!=
0
)
{
return
-
FDT_ERR_BADVALUE
;
}
return
0
;
}
/*
* Write cells in place to a given property of the given node. At most 2 cells
* of the property are written. Returns 0 on success, and -1 upon error.
...
...
common/uuid.c
0 → 100644
View file @
b29dec5c
/*
* Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <string.h>
#include <common/debug.h>
#include <common/uuid.h>
/* Return the hex nibble value of a char */
static
int8_t
hex_val
(
char
hex
)
{
int8_t
val
=
0
;
if
((
hex
>=
'0'
)
&&
(
hex
<=
'9'
))
{
val
=
(
int8_t
)(
hex
-
'0'
);
}
else
if
((
hex
>=
'a'
)
&&
(
hex
<=
'f'
))
{
val
=
(
int8_t
)(
hex
-
'a'
+
0xa
);
}
else
if
((
hex
>=
'A'
)
&&
(
hex
<=
'F'
))
{
val
=
(
int8_t
)(
hex
-
'A'
+
0xa
);
}
else
{
val
=
-
1
;
}
return
val
;
}
/*
* Read hex_src_len hex characters from hex_src, convert to bytes and
* store in buffer pointed to by dest
*/
static
int
read_hex
(
uint8_t
*
dest
,
char
*
hex_src
,
unsigned
int
hex_src_len
)
{
int8_t
nibble
;
uint8_t
byte
;
/*
* The string length must be a multiple of 2 to represent an
* exact number of bytes.
*/
assert
((
hex_src_len
%
2U
)
==
0U
);
for
(
unsigned
int
i
=
0U
;
i
<
(
hex_src_len
/
2U
);
i
++
)
{
nibble
=
0
;
byte
=
0U
;
nibble
=
hex_val
(
hex_src
[
2U
*
i
]);
if
(
nibble
<
0
)
{
return
-
1
;
}
byte
=
(
uint8_t
)
nibble
;
byte
<<=
4U
;
nibble
=
hex_val
(
hex_src
[(
2U
*
i
)
+
1U
]);
if
(
nibble
<
0
)
{
return
-
1
;
}
byte
|=
(
uint8_t
)
nibble
;
*
dest
=
byte
;
dest
++
;
}
return
0
;
}
/* Parse UUIDs of the form aabbccdd-eeff-4099-8877-665544332211 */
int
read_uuid
(
uint8_t
*
dest
,
char
*
uuid
)
{
int
err
;
/* Check that we have enough characters */
if
(
strnlen
(
uuid
,
UUID_STRING_LENGTH
)
!=
UUID_STRING_LENGTH
)
{
WARN
(
"UUID string is too short
\n
"
);
return
-
EINVAL
;
}
/* aabbccdd */
err
=
read_hex
(
dest
,
uuid
,
8
);
uuid
+=
8
;
dest
+=
4
;
/* Check for '-' */
err
|=
((
*
uuid
==
'-'
)
?
0
:
-
1
);
uuid
++
;
/* eeff */
err
|=
read_hex
(
dest
,
uuid
,
4
);
uuid
+=
4
;
dest
+=
2
;
/* Check for '-' */
err
|=
((
*
uuid
==
'-'
)
?
0
:
-
1
);
uuid
++
;
/* 4099 */
err
|=
read_hex
(
dest
,
uuid
,
4
);
uuid
+=
4
;
dest
+=
2
;
/* Check for '-' */
err
|=
((
*
uuid
==
'-'
)
?
0
:
-
1
);
uuid
++
;
/* 8877 */
err
|=
read_hex
(
dest
,
uuid
,
4
);
uuid
+=
4
;
dest
+=
2
;
/* Check for '-' */
err
|=
((
*
uuid
==
'-'
)
?
0
:
-
1
);
uuid
++
;
/* 665544332211 */
err
|=
read_hex
(
dest
,
uuid
,
12
);
uuid
+=
12
;
dest
+=
6
;
if
(
err
<
0
)
{
WARN
(
"Error parsing UUID
\n
"
);
/* Clear the buffer on error */
memset
((
void
*
)
dest
,
'\0'
,
UUID_BYTES_LENGTH
*
sizeof
(
uint8_t
));
return
-
EINVAL
;
}
return
0
;
}
include/common/fdt_wrappers.h
View file @
b29dec5c
/*
* Copyright (c) 2018-202
0
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2018-202
1
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -24,6 +24,8 @@ int fdt_read_uint32_array(const void *dtb, int node, const char *prop_name,
unsigned
int
cells
,
uint32_t
*
value
);
int
fdtw_read_string
(
const
void
*
dtb
,
int
node
,
const
char
*
prop
,
char
*
str
,
size_t
size
);
int
fdtw_read_uuid
(
const
void
*
dtb
,
int
node
,
const
char
*
prop
,
unsigned
int
length
,
uint8_t
*
uuid
);
int
fdtw_write_inplace_cells
(
void
*
dtb
,
int
node
,
const
char
*
prop
,
unsigned
int
cells
,
void
*
value
);
int
fdtw_read_bytes
(
const
void
*
dtb
,
int
node
,
const
char
*
prop
,
...
...
include/common/uuid.h
0 → 100644
View file @
b29dec5c
/*
* Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef UUID_H
#define UUID_H
#define UUID_BYTES_LENGTH 16
#define UUID_STRING_LENGTH 36
int
read_uuid
(
uint8_t
*
dest
,
char
*
uuid
);
#endif
/* UUID_H */
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