aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec.c2
-rw-r--r--hw/an5206.c1
-rw-r--r--hw/boards.h2
-rw-r--r--hw/etraxfs.c1
-rw-r--r--hw/gumstix.c2
-rw-r--r--hw/integratorcp.c15
-rw-r--r--hw/mainstone.c23
-rw-r--r--hw/mcf5208.c1
-rw-r--r--hw/mips_jazz.c2
-rw-r--r--hw/mips_malta.c1
-rw-r--r--hw/mips_mipssim.c1
-rw-r--r--hw/mips_r4k.c1
-rw-r--r--hw/nseries.c1
-rw-r--r--hw/palm.c1
-rw-r--r--hw/pc.c4
-rw-r--r--hw/ppc405_boards.c2
-rw-r--r--hw/ppc_chrp.c1
-rw-r--r--hw/ppc_oldworld.c1
-rw-r--r--hw/ppc_prep.c1
-rw-r--r--hw/r2d.c3
-rw-r--r--hw/realview.c3
-rw-r--r--hw/shix.c3
-rw-r--r--hw/spitz.c19
-rw-r--r--hw/stellaris.c2
-rw-r--r--hw/sun4m.c12
-rw-r--r--hw/sun4u.c1
-rw-r--r--sysemu.h2
-rw-r--r--vl.c22
28 files changed, 98 insertions, 32 deletions
diff --git a/exec.c b/exec.c
index 877de89f1d..09401371a9 100644
--- a/exec.c
+++ b/exec.c
@@ -2093,7 +2093,7 @@ uint32_t cpu_get_physical_page_desc(target_phys_addr_t addr)
ram_addr_t qemu_ram_alloc(unsigned int size)
{
ram_addr_t addr;
- if ((phys_ram_alloc_offset + size) >= phys_ram_size) {
+ if ((phys_ram_alloc_offset + size) > phys_ram_size) {
fprintf(stderr, "Not enough memory (requested_size = %u, max memory = %d)\n",
size, phys_ram_size);
abort();
diff --git a/hw/an5206.c b/hw/an5206.c
index 52be63b772..320b3f76ff 100644
--- a/hw/an5206.c
+++ b/hw/an5206.c
@@ -91,4 +91,5 @@ QEMUMachine an5206_machine = {
"an5206",
"Arnewsh 5206",
an5206_init,
+ 512,
};
diff --git a/hw/boards.h b/hw/boards.h
index 42a4437aff..4c91e97474 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -14,6 +14,8 @@ typedef struct QEMUMachine {
const char *name;
const char *desc;
QEMUMachineInitFunc *init;
+#define RAMSIZE_FIXED (1 << 0)
+ size_t ram_require;
struct QEMUMachine *next;
} QEMUMachine;
diff --git a/hw/etraxfs.c b/hw/etraxfs.c
index 7c3f59edcf..d3b92499d9 100644
--- a/hw/etraxfs.c
+++ b/hw/etraxfs.c
@@ -124,4 +124,5 @@ QEMUMachine bareetraxfs_machine = {
"bareetraxfs",
"Bare ETRAX FS board",
bareetraxfs_init,
+ 0x800000,
};
diff --git a/hw/gumstix.c b/hw/gumstix.c
index 2cf52f9c07..55425e1cb6 100644
--- a/hw/gumstix.c
+++ b/hw/gumstix.c
@@ -125,10 +125,12 @@ QEMUMachine connex_machine = {
"connex",
"Gumstix Connex (PXA255)",
connex_init,
+ (0x05000000 + PXA2XX_INTERNAL_SIZE) | RAMSIZE_FIXED,
};
QEMUMachine verdex_machine = {
"verdex",
"Gumstix Verdex (PXA270)",
verdex_init,
+ (0x12000000 + PXA2XX_INTERNAL_SIZE) | RAMSIZE_FIXED,
};
diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index f6e636441a..8a757546ae 100644
--- a/hw/integratorcp.c
+++ b/hw/integratorcp.c
@@ -231,7 +231,7 @@ static CPUWriteMemoryFunc *integratorcm_writefn[] = {
integratorcm_write
};
-static void integratorcm_init(int memsz, uint32_t flash_offset)
+static void integratorcm_init(int memsz)
{
int iomemtype;
integratorcm_state *s;
@@ -258,7 +258,7 @@ static void integratorcm_init(int memsz, uint32_t flash_offset)
}
memcpy(integrator_spd + 73, "QEMU-MEMORY", 11);
s->cm_init = 0x00000112;
- s->flash_offset = flash_offset;
+ s->flash_offset = qemu_ram_alloc(0x100000);
iomemtype = cpu_register_io_memory(0, integratorcm_readfn,
integratorcm_writefn, s);
@@ -480,7 +480,7 @@ static void integratorcp_init(int ram_size, int vga_ram_size,
const char *initrd_filename, const char *cpu_model)
{
CPUState *env;
- uint32_t bios_offset;
+ uint32_t ram_offset;
qemu_irq *pic;
qemu_irq *cpu_pic;
int sd;
@@ -492,15 +492,15 @@ static void integratorcp_init(int ram_size, int vga_ram_size,
fprintf(stderr, "Unable to find CPU definition\n");
exit(1);
}
- bios_offset = ram_size + vga_ram_size;
+ ram_offset = qemu_ram_alloc(ram_size);
/* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */
/* ??? RAM shoud repeat to fill physical memory space. */
/* SDRAM at address zero*/
- cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
+ cpu_register_physical_memory(0, ram_size, ram_offset | IO_MEM_RAM);
/* And again at address 0x80000000 */
- cpu_register_physical_memory(0x80000000, ram_size, IO_MEM_RAM);
+ cpu_register_physical_memory(0x80000000, ram_size, ram_offset | IO_MEM_RAM);
- integratorcm_init(ram_size >> 20, bios_offset);
+ integratorcm_init(ram_size >> 20);
cpu_pic = arm_pic_init_cpu(env);
pic = icp_pic_init(0x14000000, cpu_pic[ARM_PIC_CPU_IRQ],
cpu_pic[ARM_PIC_CPU_FIQ]);
@@ -543,4 +543,5 @@ QEMUMachine integratorcp_machine = {
"integratorcp",
"ARM Integrator/CP (ARM926EJ-S)",
integratorcp_init,
+ 0x100000,
};
diff --git a/hw/mainstone.c b/hw/mainstone.c
index 9564fc37fa..1a876800cc 100644
--- a/hw/mainstone.c
+++ b/hw/mainstone.c
@@ -59,6 +59,10 @@ static struct keymap map[0xE0] = {
enum mainstone_model_e { mainstone };
+#define MAINSTONE_RAM 0x04000000
+#define MAINSTONE_ROM 0x00800000
+#define MAINSTONE_FLASH 0x02000000
+
static struct arm_boot_info mainstone_binfo = {
.loader_start = PXA2XX_SDRAM_BASE,
.ram_size = 0x04000000,
@@ -69,9 +73,6 @@ static void mainstone_common_init(int ram_size, int vga_ram_size,
const char *kernel_cmdline, const char *initrd_filename,
const char *cpu_model, enum mainstone_model_e model, int arm_id)
{
- uint32_t mainstone_ram = mainstone_binfo.ram_size;
- uint32_t mainstone_rom = 0x00800000;
- uint32_t mainstone_flash = 0x02000000;
uint32_t sector_len = 256 * 1024;
target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
struct pxa2xx_state_s *cpu;
@@ -82,17 +83,17 @@ static void mainstone_common_init(int ram_size, int vga_ram_size,
cpu_model = "pxa270-c5";
/* Setup CPU & memory */
- if (ram_size < mainstone_ram + mainstone_rom + 2 * mainstone_flash +
+ if (ram_size < MAINSTONE_RAM + MAINSTONE_ROM + 2 * MAINSTONE_FLASH +
PXA2XX_INTERNAL_SIZE) {
fprintf(stderr, "This platform requires %i bytes of memory\n",
- mainstone_ram + mainstone_rom + 2 * mainstone_flash +
+ MAINSTONE_RAM + MAINSTONE_ROM + 2 * MAINSTONE_FLASH +
PXA2XX_INTERNAL_SIZE);
exit(1);
}
- cpu = pxa270_init(mainstone_ram, ds, cpu_model);
- cpu_register_physical_memory(0, mainstone_rom,
- qemu_ram_alloc(mainstone_rom) | IO_MEM_ROM);
+ cpu = pxa270_init(mainstone_binfo.ram_size, ds, cpu_model);
+ cpu_register_physical_memory(0, MAINSTONE_ROM,
+ qemu_ram_alloc(MAINSTONE_ROM) | IO_MEM_ROM);
/* Setup initial (reset) machine state */
cpu->env->regs[15] = mainstone_binfo.loader_start;
@@ -107,9 +108,9 @@ static void mainstone_common_init(int ram_size, int vga_ram_size,
}
if (!pflash_cfi01_register(mainstone_flash_base[i],
- qemu_ram_alloc(mainstone_flash),
+ qemu_ram_alloc(MAINSTONE_FLASH),
drives_table[index].bdrv, sector_len,
- mainstone_flash / sector_len, 4, 0, 0, 0, 0)) {
+ MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0)) {
fprintf(stderr, "qemu: Error registering flash memory.\n");
exit(1);
}
@@ -146,4 +147,6 @@ QEMUMachine mainstone2_machine = {
"mainstone",
"Mainstone II (PXA27x)",
mainstone_init,
+ (MAINSTONE_RAM + MAINSTONE_ROM + 2 * MAINSTONE_FLASH +
+ PXA2XX_INTERNAL_SIZE) | RAMSIZE_FIXED,
};
diff --git a/hw/mcf5208.c b/hw/mcf5208.c
index d7e7dcf5d7..fd9c8aa0cd 100644
--- a/hw/mcf5208.c
+++ b/hw/mcf5208.c
@@ -308,4 +308,5 @@ QEMUMachine mcf5208evb_machine = {
"mcf5208evb",
"MCF5206EVB",
mcf5208evb_init,
+ 16384,
};
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index b377b20170..e5e5bafa51 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -277,10 +277,12 @@ QEMUMachine mips_magnum_machine = {
"magnum",
"MIPS Magnum",
mips_magnum_init,
+ MAGNUM_BIOS_SIZE + VGA_RAM_SIZE,
};
QEMUMachine mips_pica61_machine = {
"pica61",
"Acer Pica 61",
mips_pica61_init,
+ MAGNUM_BIOS_SIZE + VGA_RAM_SIZE,
};
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index d39a02b909..69b16b78a0 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -949,4 +949,5 @@ QEMUMachine mips_malta_machine = {
"malta",
"MIPS Malta Core LV",
mips_malta_init,
+ VGA_RAM_SIZE + BIOS_SIZE,
};
diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c
index fe753146e3..fac23be9a3 100644
--- a/hw/mips_mipssim.c
+++ b/hw/mips_mipssim.c
@@ -195,4 +195,5 @@ QEMUMachine mips_mipssim_machine = {
"mipssim",
"MIPS MIPSsim platform",
mips_mipssim_init,
+ BIOS_SIZE + VGA_RAM_SIZE /* unused */,
};
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index fca5651343..fcebd4705a 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -286,4 +286,5 @@ QEMUMachine mips_machine = {
"mips",
"mips r4k platform",
mips_r4k_init,
+ VGA_RAM_SIZE + BIOS_SIZE,
};
diff --git a/hw/nseries.c b/hw/nseries.c
index 430b8f872d..f6f69a06ac 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -941,4 +941,5 @@ QEMUMachine n800_machine = {
"n800",
"Nokia N800 aka. RX-34 tablet (OMAP2420)",
n800_init,
+ (0x08000000 + 0x00010000 + OMAP242X_SRAM_SIZE) | RAMSIZE_FIXED,
};
diff --git a/hw/palm.c b/hw/palm.c
index a1ecaf022f..ac6ff803e4 100644
--- a/hw/palm.c
+++ b/hw/palm.c
@@ -274,4 +274,5 @@ QEMUMachine palmte_machine = {
"cheetah",
"Palm Tungsten|E aka. Cheetah PDA (OMAP310)",
palmte_init,
+ (0x02000000 + 0x00800000 + OMAP15XX_SRAM_SIZE) | RAMSIZE_FIXED,
};
diff --git a/hw/pc.c b/hw/pc.c
index abd96f0fb3..d1db2a5887 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -39,6 +39,8 @@
#define VGABIOS_FILENAME "vgabios.bin"
#define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin"
+#define PC_MAX_BIOS_SIZE (4 * 1024 * 1024)
+
/* Leave a chunk of memory at the top of RAM for the BIOS ACPI tables. */
#define ACPI_DATA_SIZE 0x10000
@@ -1018,10 +1020,12 @@ QEMUMachine pc_machine = {
"pc",
"Standard PC",
pc_init_pci,
+ VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
};
QEMUMachine isapc_machine = {
"isapc",
"ISA-only PC",
pc_init_isa,
+ VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
};
diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c
index b1a15e8a84..9ed299504b 100644
--- a/hw/ppc405_boards.c
+++ b/hw/ppc405_boards.c
@@ -360,6 +360,7 @@ QEMUMachine ref405ep_machine = {
"ref405ep",
"ref405ep",
ref405ep_init,
+ (128 * 1024 * 1024 + 4096 + 512 * 1024 + BIOS_SIZE) | RAMSIZE_FIXED,
};
/*****************************************************************************/
@@ -642,4 +643,5 @@ QEMUMachine taihu_machine = {
"taihu",
"taihu",
taihu_405ep_init,
+ (128 * 1024 * 1024 + 4096 + BIOS_SIZE + 32 * 1024 * 1024) | RAMSIZE_FIXED,
};
diff --git a/hw/ppc_chrp.c b/hw/ppc_chrp.c
index 4437a1038e..c74dfd4e05 100644
--- a/hw/ppc_chrp.c
+++ b/hw/ppc_chrp.c
@@ -335,4 +335,5 @@ QEMUMachine core99_machine = {
"mac99",
"Mac99 based PowerMAC",
ppc_core99_init,
+ BIOS_SIZE + VGA_RAM_SIZE,
};
diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
index 6b4f202d01..a85524c31b 100644
--- a/hw/ppc_oldworld.c
+++ b/hw/ppc_oldworld.c
@@ -370,4 +370,5 @@ QEMUMachine heathrow_machine = {
"g3bw",
"Heathrow based PowerMAC",
ppc_heathrow_init,
+ BIOS_SIZE + VGA_RAM_SIZE,
};
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index c42688e427..63ef15aff2 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -764,4 +764,5 @@ QEMUMachine prep_machine = {
"prep",
"PowerPC PREP platform",
ppc_prep_init,
+ BIOS_SIZE + VGA_RAM_SIZE,
};
diff --git a/hw/r2d.c b/hw/r2d.c
index b6cc31c548..8480cf32d9 100644
--- a/hw/r2d.c
+++ b/hw/r2d.c
@@ -69,5 +69,6 @@ static void r2d_init(int ram_size, int vga_ram_size,
QEMUMachine r2d_machine = {
"r2d",
"r2d-plus board",
- r2d_init
+ r2d_init,
+ SDRAM_SIZE | RAMSIZE_FIXED
};
diff --git a/hw/realview.c b/hw/realview.c
index acf3b9ee0a..c3b26fa49a 100644
--- a/hw/realview.c
+++ b/hw/realview.c
@@ -199,5 +199,6 @@ static void realview_init(int ram_size, int vga_ram_size,
QEMUMachine realview_machine = {
"realview",
"ARM RealView Emulation Baseboard (ARM926EJ-S)",
- realview_init
+ realview_init,
+ 0x1000
};
diff --git a/hw/shix.c b/hw/shix.c
index 533b159359..5f8b2e11ad 100644
--- a/hw/shix.c
+++ b/hw/shix.c
@@ -110,5 +110,6 @@ static void shix_init(int ram_size, int vga_ram_size,
QEMUMachine shix_machine = {
"shix",
"shix card",
- shix_init
+ shix_init,
+ (0x00004000 + 0x01000000 + 0x01000000) | RAMSIZE_FIXED
};
diff --git a/hw/spitz.c b/hw/spitz.c
index b059f9a9f6..28987a6f88 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -1180,6 +1180,9 @@ static void sl_bootparam_write(uint32_t ptr)
/* Board init. */
enum spitz_model_e { spitz, akita, borzoi, terrier };
+#define SPITZ_RAM 0x04000000
+#define SPITZ_ROM 0x00800000
+
static struct arm_boot_info spitz_binfo = {
.loader_start = PXA2XX_SDRAM_BASE,
.ram_size = 0x04000000,
@@ -1190,8 +1193,6 @@ static void spitz_common_init(int ram_size, int vga_ram_size,
const char *kernel_cmdline, const char *initrd_filename,
const char *cpu_model, enum spitz_model_e model, int arm_id)
{
- uint32_t spitz_ram = spitz_binfo.ram_size;
- uint32_t spitz_rom = 0x00800000;
struct pxa2xx_state_s *cpu;
struct scoop_info_s *scp;
@@ -1199,17 +1200,17 @@ static void spitz_common_init(int ram_size, int vga_ram_size,
cpu_model = (model == terrier) ? "pxa270-c5" : "pxa270-c0";
/* Setup CPU & memory */
- if (ram_size < spitz_ram + spitz_rom + PXA2XX_INTERNAL_SIZE) {
+ if (ram_size < SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE) {
fprintf(stderr, "This platform requires %i bytes of memory\n",
- spitz_ram + spitz_rom + PXA2XX_INTERNAL_SIZE);
+ SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE);
exit(1);
}
- cpu = pxa270_init(spitz_ram, ds, cpu_model);
+ cpu = pxa270_init(spitz_binfo.ram_size, ds, cpu_model);
sl_flash_register(cpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
- cpu_register_physical_memory(0, spitz_rom,
- qemu_ram_alloc(spitz_rom) | IO_MEM_ROM);
+ cpu_register_physical_memory(0, SPITZ_ROM,
+ qemu_ram_alloc(SPITZ_ROM) | IO_MEM_ROM);
/* Setup peripherals */
spitz_keyboard_register(cpu);
@@ -1285,22 +1286,26 @@ QEMUMachine akitapda_machine = {
"akita",
"Akita PDA (PXA270)",
akita_init,
+ SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
};
QEMUMachine spitzpda_machine = {
"spitz",
"Spitz PDA (PXA270)",
spitz_init,
+ SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
};
QEMUMachine borzoipda_machine = {
"borzoi",
"Borzoi PDA (PXA270)",
borzoi_init,
+ SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
};
QEMUMachine terrierpda_machine = {
"terrier",
"Terrier PDA (PXA270)",
terrier_init,
+ SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
};
diff --git a/hw/stellaris.c b/hw/stellaris.c
index 68f7137b13..1b0267c15e 100644
--- a/hw/stellaris.c
+++ b/hw/stellaris.c
@@ -1189,10 +1189,12 @@ QEMUMachine lm3s811evb_machine = {
"lm3s811evb",
"Stellaris LM3S811EVB",
lm3s811evb_init,
+ (64 * 1024 * 1024 + 8 * 1024 * 1024) | RAMSIZE_FIXED,
};
QEMUMachine lm3s6965evb_machine = {
"lm3s6965evb",
"Stellaris LM3S6965EVB",
lm3s6965evb_init,
+ (256 * 1024 * 1024 + 64 * 1024 * 1024) | RAMSIZE_FIXED,
};
diff --git a/hw/sun4m.c b/hw/sun4m.c
index b983c75811..45eb9d8b35 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -1213,60 +1213,70 @@ QEMUMachine ss5_machine = {
"SS-5",
"Sun4m platform, SPARCstation 5",
ss5_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss10_machine = {
"SS-10",
"Sun4m platform, SPARCstation 10",
ss10_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss600mp_machine = {
"SS-600MP",
"Sun4m platform, SPARCserver 600MP",
ss600mp_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss20_machine = {
"SS-20",
"Sun4m platform, SPARCstation 20",
ss20_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss2_machine = {
"SS-2",
"Sun4c platform, SPARCstation 2",
ss2_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine voyager_machine = {
"Voyager",
"Sun4m platform, SPARCstation Voyager",
vger_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss_lx_machine = {
"LX",
"Sun4m platform, SPARCstation LX",
ss_lx_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss4_machine = {
"SS-4",
"Sun4m platform, SPARCstation 4",
ss4_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine scls_machine = {
"SPARCClassic",
"Sun4m platform, SPARCClassic",
scls_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine sbook_machine = {
"SPARCbook",
"Sun4m platform, SPARCbook",
sbook_init,
+ PROM_SIZE_MAX + 0x00100000,
};
static const struct sun4d_hwdef sun4d_hwdefs[] = {
@@ -1503,10 +1513,12 @@ QEMUMachine ss1000_machine = {
"SS-1000",
"Sun4d platform, SPARCserver 1000",
ss1000_init,
+ PROM_SIZE_MAX + 0x00100000,
};
QEMUMachine ss2000_machine = {
"SS-2000",
"Sun4d platform, SPARCcenter 2000",
ss2000_init,
+ PROM_SIZE_MAX + 0x00100000,
};
diff --git a/hw/sun4u.c b/hw/sun4u.c
index 183f64a5ac..5b0e03a4e4 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -385,4 +385,5 @@ QEMUMachine sun4u_machine = {
"sun4u",
"Sun4u platform",
sun4u_init,
+ PROM_SIZE_MAX + VGA_RAM_SIZE,
};
diff --git a/sysemu.h b/sysemu.h
index 0f18e049e0..30bf966c67 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -108,8 +108,6 @@ extern const char *prom_envs[MAX_PROM_ENVS];
extern unsigned int nb_prom_envs;
#endif
-/* XXX: make it dynamic */
-#define MAX_BIOS_SIZE (4 * 1024 * 1024)
#if defined (TARGET_PPC)
#define BIOS_SIZE (1024 * 1024)
#elif defined (TARGET_SPARC64)
diff --git a/vl.c b/vl.c
index 78486cf10e..0825281ef9 100644
--- a/vl.c
+++ b/vl.c
@@ -8277,7 +8277,7 @@ int main(int argc, char **argv)
machine = first_machine;
cpu_model = NULL;
initrd_filename = NULL;
- ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
+ ram_size = -1;
vga_ram_size = VGA_RAM_SIZE;
#ifdef CONFIG_GDBSTUB
use_gdbstub = 0;
@@ -8963,7 +8963,25 @@ int main(int argc, char **argv)
#endif
/* init the memory */
- phys_ram_size = ram_size + vga_ram_size + MAX_BIOS_SIZE;
+ phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
+
+ if (machine->ram_require & RAMSIZE_FIXED) {
+ if (ram_size > 0) {
+ if (ram_size < phys_ram_size) {
+ fprintf(stderr, "Machine `%s' requires %i bytes of memory\n",
+ machine->name, phys_ram_size);
+ exit(-1);
+ }
+
+ phys_ram_size = ram_size;
+ } else
+ ram_size = phys_ram_size;
+ } else {
+ if (ram_size < 0)
+ ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
+
+ phys_ram_size += ram_size;
+ }
phys_ram_base = qemu_vmalloc(phys_ram_size);
if (!phys_ram_base) {