#include "pci_ids.h" // PCI_VENDOR_ID_INTEL
#include "pci_regs.h" // PCI_INTERRUPT_LINE
#include "ioport.h" // inl
-#include "paravirt.h" // qemu_cfg_irq0_override
-#include "dev-q35.h" // qemu_cfg_irq0_override
+#include "config.h" // CONFIG_*
+#include "dev-q35.h"
/****************************************************/
/* ACPI tables init */
static void *
build_srat(void)
{
- int nb_numa_nodes = qemu_cfg_get_numa_nodes();
-
- if (nb_numa_nodes == 0)
- return NULL;
-
- u64 *numadata = malloc_tmphigh(sizeof(u64) * (MaxCountCPUs + nb_numa_nodes));
- if (!numadata) {
- warn_noalloc();
+ int filesize;
+ u64 *numadata = romfile_loadfile("etc/numa-nodes", &filesize);
+ if (!numadata)
return NULL;
- }
-
- qemu_cfg_get_numa_data(numadata, MaxCountCPUs + nb_numa_nodes);
+ int max_cpu = romfile_loadint("etc/max-cpus", 0);
+ int nb_numa_nodes = (filesize / sizeof(u64)) - max_cpu;
struct system_resource_affinity_table *srat;
int srat_size = sizeof(*srat) +
- sizeof(struct srat_processor_affinity) * MaxCountCPUs +
+ sizeof(struct srat_processor_affinity) * max_cpu +
sizeof(struct srat_memory_affinity) * (nb_numa_nodes + 2);
srat = malloc_high(srat_size);
int i;
u64 curnode;
- for (i = 0; i < MaxCountCPUs; ++i) {
+ for (i = 0; i < max_cpu; ++i) {
core->type = SRAT_PROCESSOR;
core->length = sizeof(*core);
core->local_apic_id = i;
return addr;
}
-int qemu_cfg_get_numa_nodes(void)
-{
- u64 cnt;
-
- qemu_cfg_read_entry(&cnt, QEMU_CFG_NUMA, sizeof(cnt));
-
- return (int)cnt;
-}
-
-void qemu_cfg_get_numa_data(u64 *data, int n)
-{
- int i;
-
- for (i = 0; i < n; i++)
- qemu_cfg_read((u8*)(data + i), sizeof(u64));
-}
-
static int
qemu_cfg_read_file(struct romfile_s *file, void *dst, u32 maxlen)
{
qemu_romfile_add("etc/irq0-override", QEMU_CFG_IRQ0_OVERRIDE, 0, 1);
qemu_romfile_add("etc/max-cpus", QEMU_CFG_MAX_CPUS, 0, 2);
+ // NUMA data
+ u64 numacount;
+ qemu_cfg_read_entry(&numacount, QEMU_CFG_NUMA, sizeof(numacount));
+ numacount += romfile_loadint("etc/max-cpus", 0);
+ qemu_romfile_add("etc/numa-nodes", QEMU_CFG_NUMA, sizeof(numacount)
+ , numacount*sizeof(u64));
+
// ACPI tables
char name[128];
u16 cnt;
void qemu_ramsize_preinit(void);
void qemu_biostable_setup(void);
void qemu_cfg_preinit(void);
-int qemu_cfg_get_numa_nodes(void);
-void qemu_cfg_get_numa_data(u64 *data, int n);
u32 qemu_cfg_e820_entries(void);
void* qemu_cfg_e820_load_next(void *addr);
void qemu_romfile_init(void);