18a0743cfSAnthony Liguori /* 28a0743cfSAnthony Liguori * libqos malloc support for PC 38a0743cfSAnthony Liguori * 48a0743cfSAnthony Liguori * Copyright IBM, Corp. 2012-2013 58a0743cfSAnthony Liguori * 68a0743cfSAnthony Liguori * Authors: 78a0743cfSAnthony Liguori * Anthony Liguori <aliguori@us.ibm.com> 88a0743cfSAnthony Liguori * 98a0743cfSAnthony Liguori * This work is licensed under the terms of the GNU GPL, version 2 or later. 108a0743cfSAnthony Liguori * See the COPYING file in the top-level directory. 118a0743cfSAnthony Liguori */ 128a0743cfSAnthony Liguori 138a0743cfSAnthony Liguori #include "libqos/malloc-pc.h" 14*26491a38SMarkus Armbruster #include "libqos/fw_cfg.h" 158a0743cfSAnthony Liguori 168a0743cfSAnthony Liguori #define NO_QEMU_PROTOS 178a0743cfSAnthony Liguori #include "hw/nvram/fw_cfg.h" 188a0743cfSAnthony Liguori 198a0743cfSAnthony Liguori #include "qemu-common.h" 208a0743cfSAnthony Liguori #include <glib.h> 218a0743cfSAnthony Liguori 228a0743cfSAnthony Liguori #define PAGE_SIZE (4096) 238a0743cfSAnthony Liguori 248a0743cfSAnthony Liguori typedef struct PCAlloc 258a0743cfSAnthony Liguori { 268a0743cfSAnthony Liguori QGuestAllocator alloc; 278a0743cfSAnthony Liguori 288a0743cfSAnthony Liguori uint64_t start; 298a0743cfSAnthony Liguori uint64_t end; 308a0743cfSAnthony Liguori } PCAlloc; 318a0743cfSAnthony Liguori 328a0743cfSAnthony Liguori static uint64_t pc_alloc(QGuestAllocator *allocator, size_t size) 338a0743cfSAnthony Liguori { 348a0743cfSAnthony Liguori PCAlloc *s = container_of(allocator, PCAlloc, alloc); 358a0743cfSAnthony Liguori uint64_t addr; 368a0743cfSAnthony Liguori 378a0743cfSAnthony Liguori 388a0743cfSAnthony Liguori size += (PAGE_SIZE - 1); 398a0743cfSAnthony Liguori size &= PAGE_SIZE; 408a0743cfSAnthony Liguori 418a0743cfSAnthony Liguori g_assert_cmpint((s->start + size), <=, s->end); 428a0743cfSAnthony Liguori 438a0743cfSAnthony Liguori addr = s->start; 448a0743cfSAnthony Liguori s->start += size; 458a0743cfSAnthony Liguori 468a0743cfSAnthony Liguori return addr; 478a0743cfSAnthony Liguori } 488a0743cfSAnthony Liguori 498a0743cfSAnthony Liguori static void pc_free(QGuestAllocator *allocator, uint64_t addr) 508a0743cfSAnthony Liguori { 518a0743cfSAnthony Liguori } 528a0743cfSAnthony Liguori 538a0743cfSAnthony Liguori QGuestAllocator *pc_alloc_init(void) 548a0743cfSAnthony Liguori { 558a0743cfSAnthony Liguori PCAlloc *s = g_malloc0(sizeof(*s)); 568a0743cfSAnthony Liguori uint64_t ram_size; 578a0743cfSAnthony Liguori QFWCFG *fw_cfg = pc_fw_cfg_init(); 588a0743cfSAnthony Liguori 598a0743cfSAnthony Liguori s->alloc.alloc = pc_alloc; 608a0743cfSAnthony Liguori s->alloc.free = pc_free; 618a0743cfSAnthony Liguori 628a0743cfSAnthony Liguori ram_size = qfw_cfg_get_u64(fw_cfg, FW_CFG_RAM_SIZE); 638a0743cfSAnthony Liguori 648a0743cfSAnthony Liguori /* Start at 1MB */ 658a0743cfSAnthony Liguori s->start = 1 << 20; 668a0743cfSAnthony Liguori 678a0743cfSAnthony Liguori /* Respect PCI hole */ 688a0743cfSAnthony Liguori s->end = MIN(ram_size, 0xE0000000); 698a0743cfSAnthony Liguori 708a0743cfSAnthony Liguori return &s->alloc; 718a0743cfSAnthony Liguori } 72