Page MenuHomeFreeBSD

fdt data verify
ActivePublic

Authored by br on Dec 10 2014, 12:53 PM.
Tags
None
Referenced Files
F56269: fdt_data_verify
Dec 10 2014, 12:53 PM
Subscribers
Index: sys/dev/fdt/fdt_common.c
===================================================================
--- sys/dev/fdt/fdt_common.c (revision 275678)
+++ sys/dev/fdt/fdt_common.c (working copy)
@@ -102,10 +102,9 @@
tuple_size = addr_cells + par_addr_cells + size_cells;
tuples = len / (tuple_size * sizeof(cell_t));
- if (fdt_ranges_verify(ranges, tuples, par_addr_cells,
- addr_cells, size_cells)) {
+ if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2)
return (ERANGE);
- }
+
*base = 0;
*size = 0;
@@ -173,10 +172,9 @@
size_cells);
tuples = len / tuple_size;
- if (fdt_ranges_verify(ranges, tuples, par_addr_cells,
- addr_cells, size_cells)) {
+ if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2)
return (ERANGE);
- }
+
*base = 0;
*size = 0;
rangesptr = &ranges[range_id];
@@ -381,20 +379,6 @@
}
int
-fdt_data_verify(void *data, int cells)
-{
- uint64_t d64;
-
- if (cells > 1) {
- d64 = fdt64_to_cpu(*((uint64_t *)data));
- if (((d64 >> 32) & 0xffffffffull) != 0 || cells > 2)
- return (ERANGE);
- }
-
- return (0);
-}
-
-int
fdt_pm_is_enabled(phandle_t node)
{
int ret;
@@ -441,54 +425,12 @@
}
int
-fdt_ranges_verify(pcell_t *ranges, int tuples, int par_addr_cells,
- int this_addr_cells, int this_size_cells)
-{
- int i, rv, ulsz;
-
- if (par_addr_cells > 2 || this_addr_cells > 2 || this_size_cells > 2)
- return (ERANGE);
-
- /*
- * This is the max size the resource manager can handle for addresses
- * and sizes.
- */
- ulsz = sizeof(u_long);
- if (par_addr_cells <= ulsz && this_addr_cells <= ulsz &&
- this_size_cells <= ulsz)
- /* We can handle everything */
- return (0);
-
- rv = 0;
- for (i = 0; i < tuples; i++) {
-
- if (fdt_data_verify((void *)ranges, par_addr_cells))
- goto err;
- ranges += par_addr_cells;
-
- if (fdt_data_verify((void *)ranges, this_addr_cells))
- goto err;
- ranges += this_addr_cells;
-
- if (fdt_data_verify((void *)ranges, this_size_cells))
- goto err;
- ranges += this_size_cells;
- }
-
- return (0);
-
-err:
- debugf("using address range >%d-bit not supported\n", ulsz * 8);
- return (ERANGE);
-}
-
-int
fdt_data_to_res(pcell_t *data, int addr_cells, int size_cells, u_long *start,
u_long *count)
{
/* Address portion. */
- if (fdt_data_verify((void *)data, addr_cells))
+ if (addr_cells > 2)
return (ERANGE);
*start = fdt_data_get((void *)data, addr_cells);
@@ -495,7 +437,7 @@
data += addr_cells;
/* Size portion. */
- if (fdt_data_verify((void *)data, size_cells))
+ if (size_cells > 2)
return (ERANGE);
*count = fdt_data_get((void *)data, size_cells);

Event Timeline

br changed the title of this paste from untitled to fdt data verify.
br updated the paste's language from autodetect to autodetect.

What is the bug you are hitting?

So I have device at 0x200001000 size 0x1000 encoded in dts file like that: reg = <0x2 0x1000 0x0 0x1000>;
fdt_data_verify() simply returns ERANGE on it because ((0x200001000 >> 32) & 0xffffffffull) != 0.