| /* |
| * libqos malloc support for PC |
| * |
| * Copyright IBM, Corp. 2012-2013 |
| * |
| * Authors: |
| * Anthony Liguori <aliguori@us.ibm.com> |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * See the COPYING file in the top-level directory. |
| */ |
| |
| #include "libqos/malloc-pc.h" |
| #include "libqos/fw_cfg.h" |
| |
| #define NO_QEMU_PROTOS |
| #include "hw/nvram/fw_cfg.h" |
| |
| #include "qemu-common.h" |
| #include <glib.h> |
| |
| #define PAGE_SIZE (4096) |
| |
| typedef struct PCAlloc |
| { |
| QGuestAllocator alloc; |
| |
| uint64_t start; |
| uint64_t end; |
| } PCAlloc; |
| |
| static uint64_t pc_alloc(QGuestAllocator *allocator, size_t size) |
| { |
| PCAlloc *s = container_of(allocator, PCAlloc, alloc); |
| uint64_t addr; |
| |
| |
| size += (PAGE_SIZE - 1); |
| size &= PAGE_SIZE; |
| |
| g_assert_cmpint((s->start + size), <=, s->end); |
| |
| addr = s->start; |
| s->start += size; |
| |
| return addr; |
| } |
| |
| static void pc_free(QGuestAllocator *allocator, uint64_t addr) |
| { |
| } |
| |
| QGuestAllocator *pc_alloc_init(void) |
| { |
| PCAlloc *s = g_malloc0(sizeof(*s)); |
| uint64_t ram_size; |
| QFWCFG *fw_cfg = pc_fw_cfg_init(); |
| |
| s->alloc.alloc = pc_alloc; |
| s->alloc.free = pc_free; |
| |
| ram_size = qfw_cfg_get_u64(fw_cfg, FW_CFG_RAM_SIZE); |
| |
| /* Start at 1MB */ |
| s->start = 1 << 20; |
| |
| /* Respect PCI hole */ |
| s->end = MIN(ram_size, 0xE0000000); |
| |
| /* clean-up */ |
| g_free(fw_cfg); |
| |
| return &s->alloc; |
| } |