From 91afd7004f8403e20846901eb784db2467ed19a9 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Fri, 24 May 2013 13:34:38 -0500 Subject: [PATCH] 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 Reviewed-on: https://gerrit.chromium.org/gerrit/56641 Reviewed-by: Duncan Laurie Reviewed-by: Stefan Reinauer --- payloads/libpayload/libcbfs/ram_media.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/payloads/libpayload/libcbfs/ram_media.c b/payloads/libpayload/libcbfs/ram_media.c index 859555c6f4..9f11a311d9 100644 --- a/payloads/libpayload/libcbfs/ram_media.c +++ b/payloads/libpayload/libcbfs/ram_media.c @@ -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;