libpayload: allow for pointers in cbfs ram media

The ram_map() handled offsets from 0->size as well as
negative offsets from the top of the region. However,
the cbfs core tries to map a offset that is actually a
pointer within the region itself. Allow for such instances.
This fixes an issue when using ram_media with tthe ebmedded
SeaBIOS cbfs.

BUG=chrome-os-partner:19691
BRANCH=none
TEST=manual: used ram_media to parse embedded SeaBIOS cbfs properly.

Change-Id: I15b0b3b643390d3784ae5887c0f17d420d59c5b6
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/56641
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-by: Stefan Reinauer <reinauer@google.com>
This commit is contained in:
Aaron Durbin 2013-05-24 13:34:38 -05:00 committed by ChromeBot
commit 91afd7004f

View file

@ -43,6 +43,12 @@ static int ram_open(struct cbfs_media *media) {
static void *ram_map(struct cbfs_media *media, size_t offset, size_t count) {
struct ram_media *m = (struct ram_media*)media->context;
/* Special case an absolute pointer within the region. */
if (offset >= (uintptr_t)m->start &&
offset < ((uintptr_t)m->start + m->size))
return (void *)offset;
/* assume addressing from top of image in this case */
if (offset > 0xf0000000) {
offset = m->size + offset;