xref: /qemu/tests/qtest/libqos/malloc-pc.c (revision 26491a388ce69d80c6d7d2b15ddf93d4399f04bc)
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