lkml.org 
[lkml]   [2020]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[GRUB PATCH RFC 06/18] mmap: Add grub_mmap_get_lowest() and grub_mmap_get_highest()
    Date
    The functions calculate lowest and highest available RAM
    addresses respectively.

    Both functions are needed to calculate PMR boundaries for
    Intel TXT secure launcher introduced by subsequent patches.

    Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
    ---
    grub-core/mmap/mmap.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++
    include/grub/memory.h | 3 +++
    2 files changed, 67 insertions(+)

    diff --git a/grub-core/mmap/mmap.c b/grub-core/mmap/mmap.c
    index b569cb23b..cf4b69f56 100644
    --- a/grub-core/mmap/mmap.c
    +++ b/grub-core/mmap/mmap.c
    @@ -340,6 +340,70 @@ grub_mmap_unregister (int handle)

    #endif /* ! GRUB_MMAP_REGISTER_BY_FIRMWARE */

    +typedef struct
    +{
    + grub_uint64_t addr;
    + grub_uint64_t limit;
    +} addr_limit_t;
    +
    +/* Helper for grub_mmap_get_lowest(). */
    +static int
    +lowest_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type,
    + void *data)
    +{
    + addr_limit_t *al = data;
    +
    + if (type != GRUB_MEMORY_AVAILABLE)
    + return 0;
    +
    + if (addr >= al->limit)
    + al->addr = grub_min (al->addr, addr);
    +
    + if ((addr < al->limit) && ((addr + size) > al->limit))
    + al->addr = al->limit;
    +
    + return 0;
    +}
    +
    +grub_uint64_t
    +grub_mmap_get_lowest (grub_uint64_t limit)
    +{
    + addr_limit_t al = {~0, limit};
    +
    + grub_mmap_iterate (lowest_hook, &al);
    +
    + return al.addr;
    +}
    +
    +/* Helper for grub_mmap_get_highest(). */
    +static int
    +highest_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type,
    + void *data)
    +{
    + addr_limit_t *al = data;
    +
    + if (type != GRUB_MEMORY_AVAILABLE)
    + return 0;
    +
    + if ((addr + size) < al->limit)
    + al->addr = grub_max (al->addr, addr + size);
    +
    + if ((addr < al->limit) && ((addr + size) >= al->limit))
    + al->addr = al->limit;
    +
    + return 0;
    +}
    +
    +grub_uint64_t
    +grub_mmap_get_highest (grub_uint64_t limit)
    +{
    + addr_limit_t al = {0, limit};
    +
    + grub_mmap_iterate (highest_hook, &al);
    +
    + return al.addr;
    +}
    +
    #define CHUNK_SIZE 0x400

    struct badram_entry {
    diff --git a/include/grub/memory.h b/include/grub/memory.h
    index 6da114a1b..8f22f7525 100644
    --- a/include/grub/memory.h
    +++ b/include/grub/memory.h
    @@ -69,6 +69,9 @@ void *grub_mmap_malign_and_register (grub_uint64_t align, grub_uint64_t size,

    void grub_mmap_free_and_unregister (int handle);

    +extern grub_uint64_t grub_mmap_get_lowest (grub_uint64_t limit);
    +extern grub_uint64_t grub_mmap_get_highest (grub_uint64_t limit);
    +
    #ifndef GRUB_MMAP_REGISTER_BY_FIRMWARE

    struct grub_mmap_region
    --
    2.11.0
    \
     
     \ /
      Last update: 2020-05-05 01:24    [W:4.547 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site