[coreboot-gerrit] Change in ...coreboot[master]: [RFC] commonlib/region: Check `xlate` regions early
Nico Huber (Code Review)
gerrit at coreboot.org
Thu Dec 6 16:27:07 CET 2018
Nico Huber has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/30083
Change subject: [RFC] commonlib/region: Check `xlate` regions early
......................................................................
[RFC] commonlib/region: Check `xlate` regions early
Makes it possible to detect errors early in rdev_chain().
Change-Id: I2cdb9dd1ab9c00b227839a03fff389ba6fe78b4a
Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
M src/commonlib/include/commonlib/region.h
M src/commonlib/region.c
2 files changed, 30 insertions(+), 39 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/83/30083/1
diff --git a/src/commonlib/include/commonlib/region.h b/src/commonlib/include/commonlib/region.h
index 45484dd..f027bc2 100644
--- a/src/commonlib/include/commonlib/region.h
+++ b/src/commonlib/include/commonlib/region.h
@@ -30,6 +30,7 @@
* chaining together multiple region_devices.
*/
+struct region;
struct region_device;
/*
@@ -84,6 +85,7 @@
ssize_t (*writeat)(const struct region_device *, const void *, size_t,
size_t);
ssize_t (*eraseat)(const struct region_device *, size_t, size_t);
+ int (*region_ok)(const struct region_device *, const struct region *);
};
struct region {
diff --git a/src/commonlib/region.c b/src/commonlib/region.c
index 541a125..6db13a3 100644
--- a/src/commonlib/region.c
+++ b/src/commonlib/region.c
@@ -36,12 +36,6 @@
return 1;
}
-static int normalize_and_ok(const struct region *outer, struct region *inner)
-{
- inner->offset += region_offset(outer);
- return region_is_subregion(outer, inner);
-}
-
static const struct region_device *rdev_root(const struct region_device *rdev)
{
if (rdev->root == NULL)
@@ -49,6 +43,18 @@
return rdev->root;
}
+static int normalize_and_ok(struct region *inner,
+ const struct region_device *outer)
+{
+ const struct region_device *rdev;
+
+ rdev = rdev_root(outer);
+
+ inner->offset += region_offset(&outer->region);
+ return region_is_subregion(&outer->region, inner) &&
+ (!rdev->ops->region_ok || rdev->ops->region_ok(rdev, inner));
+}
+
ssize_t rdev_relative_offset(const struct region_device *p,
const struct region_device *c)
{
@@ -69,7 +75,7 @@
.size = size,
};
- if (!normalize_and_ok(&rd->region, &req))
+ if (!normalize_and_ok(&req, rd))
return NULL;
rdev = rdev_root(rd);
@@ -101,7 +107,7 @@
.size = size,
};
- if (!normalize_and_ok(&rd->region, &req))
+ if (!normalize_and_ok(&req, rd))
return -1;
rdev = rdev_root(rd);
@@ -118,7 +124,7 @@
.size = size,
};
- if (!normalize_and_ok(&rd->region, &req))
+ if (!normalize_and_ok(&req, rd))
return -1;
rdev = rdev_root(rd);
@@ -138,7 +144,7 @@
.size = size,
};
- if (!normalize_and_ok(&rd->region, &req))
+ if (!normalize_and_ok(&req, rd))
return -1;
rdev = rdev_root(rd);
@@ -159,7 +165,7 @@
.size = size,
};
- if (!normalize_and_ok(&parent->region, &req))
+ if (!normalize_and_ok(&req, parent))
return -1;
/* Keep track of root region device. Note the offsets are relative
@@ -343,16 +349,9 @@
size_t size)
{
const struct xlate_region_device *xldev;
- struct region req = {
- .offset = offset,
- .size = size,
- };
xldev = container_of(rd, __typeof__(*xldev), rdev);
- if (!region_is_subregion(&xldev->sub_region, &req))
- return NULL;
-
offset -= region_offset(&xldev->sub_region);
return rdev_mmap(xldev->access_dev, offset, size);
@@ -370,17 +369,10 @@
static ssize_t xlate_readat(const struct region_device *rd, void *b,
size_t offset, size_t size)
{
- struct region req = {
- .offset = offset,
- .size = size,
- };
const struct xlate_region_device *xldev;
xldev = container_of(rd, __typeof__(*xldev), rdev);
- if (!region_is_subregion(&xldev->sub_region, &req))
- return -1;
-
offset -= region_offset(&xldev->sub_region);
return rdev_readat(xldev->access_dev, b, offset, size);
@@ -389,17 +381,10 @@
static ssize_t xlate_writeat(const struct region_device *rd, const void *b,
size_t offset, size_t size)
{
- struct region req = {
- .offset = offset,
- .size = size,
- };
const struct xlate_region_device *xldev;
xldev = container_of(rd, __typeof__(*xldev), rdev);
- if (!region_is_subregion(&xldev->sub_region, &req))
- return -1;
-
offset -= region_offset(&xldev->sub_region);
return rdev_writeat(xldev->access_dev, b, offset, size);
@@ -408,26 +393,29 @@
static ssize_t xlate_eraseat(const struct region_device *rd,
size_t offset, size_t size)
{
- struct region req = {
- .offset = offset,
- .size = size,
- };
const struct xlate_region_device *xldev;
xldev = container_of(rd, __typeof__(*xldev), rdev);
- if (!region_is_subregion(&xldev->sub_region, &req))
- return -1;
-
offset -= region_offset(&xldev->sub_region);
return rdev_eraseat(xldev->access_dev, offset, size);
}
+static int xlate_region_ok(const struct region_device *rd,
+ const struct region *req)
+{
+ const struct xlate_region_device *xldev;
+
+ xldev = container_of(rd, __typeof__(*xldev), rdev);
+ return region_is_subregion(&xldev->sub_region, req);
+}
+
const struct region_device_ops xlate_rdev_ro_ops = {
.mmap = xlate_mmap,
.munmap = xlate_munmap,
.readat = xlate_readat,
+ .region_ok = xlate_region_ok,
};
const struct region_device_ops xlate_rdev_rw_ops = {
@@ -436,6 +424,7 @@
.readat = xlate_readat,
.writeat = xlate_writeat,
.eraseat = xlate_eraseat,
+ .region_ok = xlate_region_ok,
};
--
To view, visit https://review.coreboot.org/c/coreboot/+/30083
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I2cdb9dd1ab9c00b227839a03fff389ba6fe78b4a
Gerrit-Change-Number: 30083
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h at gmx.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20181206/65c3c90e/attachment.html>
More information about the coreboot-gerrit
mailing list