mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-07 05:51:36 +00:00
amd64 port
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@764 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
d927637dca
commit
7fd7b91fac
@ -55,7 +55,6 @@ do { \
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BIOS_FILENAME "ppc_rom.bin"
|
#define BIOS_FILENAME "ppc_rom.bin"
|
||||||
#define LINUX_BOOT_FILENAME "linux_boot.bin"
|
|
||||||
|
|
||||||
#define KERNEL_LOAD_ADDR 0x00000000
|
#define KERNEL_LOAD_ADDR 0x00000000
|
||||||
#define KERNEL_STACK_ADDR 0x00400000
|
#define KERNEL_STACK_ADDR 0x00400000
|
||||||
@ -677,13 +676,18 @@ static void VGA_init (void)
|
|||||||
|
|
||||||
extern CPUPPCState *global_env;
|
extern CPUPPCState *global_env;
|
||||||
|
|
||||||
|
static uint32_t get_le32 (void *addr)
|
||||||
|
{
|
||||||
|
return le32_to_cpu(*((uint32_t *)addr));
|
||||||
|
}
|
||||||
|
|
||||||
void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
||||||
uint32_t kernel_addr, uint32_t kernel_size,
|
uint32_t kernel_addr, uint32_t kernel_size,
|
||||||
uint32_t stack_addr, int boot_device,
|
uint32_t stack_addr, int boot_device,
|
||||||
const unsigned char *initrd_file)
|
const unsigned char *initrd_file)
|
||||||
{
|
{
|
||||||
CPUPPCState *env = global_env;
|
CPUPPCState *env = global_env;
|
||||||
char *p;
|
uint8_t *p;
|
||||||
#if !defined (USE_OPEN_FIRMWARE)
|
#if !defined (USE_OPEN_FIRMWARE)
|
||||||
char *tmp;
|
char *tmp;
|
||||||
uint32_t tmpi[2];
|
uint32_t tmpi[2];
|
||||||
@ -697,8 +701,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
/* Fake bootloader */
|
/* Fake bootloader */
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
uint32_t offset =
|
uint32_t offset = get_le32(phys_ram_base + kernel_addr);
|
||||||
*((uint32_t *)(phys_ram_base + kernel_addr));
|
|
||||||
#else
|
#else
|
||||||
uint32_t offset = 12;
|
uint32_t offset = 12;
|
||||||
#endif
|
#endif
|
||||||
@ -723,7 +726,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
* it's not ready to handle it...
|
* it's not ready to handle it...
|
||||||
*/
|
*/
|
||||||
env->decr = 0xFFFFFFFF;
|
env->decr = 0xFFFFFFFF;
|
||||||
p = (void *)(phys_ram_base + kernel_addr);
|
p = phys_ram_base + kernel_addr;
|
||||||
#if !defined (USE_OPEN_FIRMWARE)
|
#if !defined (USE_OPEN_FIRMWARE)
|
||||||
/* Let's register the whole memory available only in supervisor mode */
|
/* Let's register the whole memory available only in supervisor mode */
|
||||||
setup_BAT(env, 0, 0x00000000, 0x00000000, mem_size, 1, 0, 2);
|
setup_BAT(env, 0, 0x00000000, 0x00000000, mem_size, 1, 0, 2);
|
||||||
@ -732,7 +735,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
*/
|
*/
|
||||||
put_long(p, 0xdeadc0de);
|
put_long(p, 0xdeadc0de);
|
||||||
/* Build a real stack room */
|
/* Build a real stack room */
|
||||||
p = (void *)(phys_ram_base + stack_addr);
|
p = phys_ram_base + stack_addr;
|
||||||
put_long(p, stack_addr);
|
put_long(p, stack_addr);
|
||||||
p -= 32;
|
p -= 32;
|
||||||
env->gpr[1] -= 32;
|
env->gpr[1] -= 32;
|
||||||
@ -742,7 +745,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
int size;
|
int size;
|
||||||
env->gpr[4] = (kernel_addr + kernel_size + 4095) & ~4095;
|
env->gpr[4] = (kernel_addr + kernel_size + 4095) & ~4095;
|
||||||
size = load_initrd(initrd_file,
|
size = load_initrd(initrd_file,
|
||||||
(void *)((uint32_t)phys_ram_base + env->gpr[4]));
|
phys_ram_base + env->gpr[4]);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
/* No initrd */
|
/* No initrd */
|
||||||
env->gpr[4] = env->gpr[5] = 0;
|
env->gpr[4] = env->gpr[5] = 0;
|
||||||
@ -759,17 +762,17 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
* The BSS starts after the kernel end.
|
* The BSS starts after the kernel end.
|
||||||
*/
|
*/
|
||||||
#if 0
|
#if 0
|
||||||
p = (void *)(((uint32_t)phys_ram_base + kernel_addr +
|
p = phys_ram_base + kernel_addr +
|
||||||
kernel_size + (1 << 20) - 1) & ~((1 << 20) - 1));
|
kernel_size + (1 << 20) - 1) & ~((1 << 20) - 1);
|
||||||
#else
|
#else
|
||||||
p = (void *)((uint32_t)phys_ram_base + kernel_addr + 0x400000);
|
p = phys_ram_base + kernel_addr + 0x400000;
|
||||||
#endif
|
#endif
|
||||||
if (loglevel > 0) {
|
if (loglevel > 0) {
|
||||||
fprintf(logfile, "bootinfos: %p 0x%08x\n",
|
fprintf(logfile, "bootinfos: %p 0x%08x\n",
|
||||||
p, (uint32_t)p - (uint32_t)phys_ram_base);
|
p, (int)(p - phys_ram_base));
|
||||||
} else {
|
} else {
|
||||||
printf("bootinfos: %p 0x%08x\n",
|
printf("bootinfos: %p 0x%08x\n",
|
||||||
p, (uint32_t)p - (uint32_t)phys_ram_base);
|
p, (int)(p - phys_ram_base));
|
||||||
}
|
}
|
||||||
/* Command line: let's put it after bootinfos */
|
/* Command line: let's put it after bootinfos */
|
||||||
#if 0
|
#if 0
|
||||||
@ -782,7 +785,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
boot_devs[boot_device - 'a'].name,
|
boot_devs[boot_device - 'a'].name,
|
||||||
mem_size >> 20);
|
mem_size >> 20);
|
||||||
#endif
|
#endif
|
||||||
env->gpr[6] = (uint32_t)p + 0x1000 - (uint32_t)phys_ram_base;
|
env->gpr[6] = p + 0x1000 - phys_ram_base;
|
||||||
env->gpr[7] = env->gpr[6] + strlen(p + 0x1000);
|
env->gpr[7] = env->gpr[6] + strlen(p + 0x1000);
|
||||||
if (loglevel > 0) {
|
if (loglevel > 0) {
|
||||||
fprintf(logfile, "cmdline: %p 0x%08x [%s]\n",
|
fprintf(logfile, "cmdline: %p 0x%08x [%s]\n",
|
||||||
@ -795,7 +798,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
p = set_bootinfo_tag(p, 0x1010, 0, 0);
|
p = set_bootinfo_tag(p, 0x1010, 0, 0);
|
||||||
/* BI_CMD_LINE */
|
/* BI_CMD_LINE */
|
||||||
p = set_bootinfo_tag(p, 0x1012, env->gpr[7] - env->gpr[6],
|
p = set_bootinfo_tag(p, 0x1012, env->gpr[7] - env->gpr[6],
|
||||||
(void *)(env->gpr[6] + (uint32_t)phys_ram_base));
|
env->gpr[6] + phys_ram_base);
|
||||||
/* BI_MEM_SIZE */
|
/* BI_MEM_SIZE */
|
||||||
tmp = (void *)tmpi;
|
tmp = (void *)tmpi;
|
||||||
tmp[0] = (mem_size >> 24) & 0xFF;
|
tmp[0] = (mem_size >> 24) & 0xFF;
|
||||||
@ -823,8 +826,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
setup_BAT(env, 0, 0x01000000, kernel_addr, 0x00400000, 1, 0, 2);
|
setup_BAT(env, 0, 0x01000000, kernel_addr, 0x00400000, 1, 0, 2);
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
uint32_t offset =
|
uint32_t offset = get_le32(phys_ram_base + kernel_addr);
|
||||||
*((uint32_t *)(phys_ram_base + kernel_addr));
|
|
||||||
#else
|
#else
|
||||||
uint32_t offset = 12;
|
uint32_t offset = 12;
|
||||||
#endif
|
#endif
|
||||||
@ -832,7 +834,7 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
printf("Start address: 0x%08x\n", env->nip);
|
printf("Start address: 0x%08x\n", env->nip);
|
||||||
}
|
}
|
||||||
env->gpr[1] = env->nip + (1 << 22);
|
env->gpr[1] = env->nip + (1 << 22);
|
||||||
p = (void *)(phys_ram_base + stack_addr);
|
p = phys_ram_base + stack_addr;
|
||||||
put_long(p - 32, stack_addr);
|
put_long(p - 32, stack_addr);
|
||||||
env->gpr[1] -= 32;
|
env->gpr[1] -= 32;
|
||||||
printf("Kernel starts at 0x%08x stack 0x%08x\n", env->nip, env->gpr[1]);
|
printf("Kernel starts at 0x%08x stack 0x%08x\n", env->nip, env->gpr[1]);
|
||||||
@ -869,10 +871,10 @@ void PPC_init_hw (/*CPUPPCState *env,*/ uint32_t mem_size,
|
|||||||
/* Command line: let's put it just over the stack */
|
/* Command line: let's put it just over the stack */
|
||||||
#if 0
|
#if 0
|
||||||
#if 0
|
#if 0
|
||||||
p = (void *)(((uint32_t)phys_ram_base + kernel_addr +
|
p = phys_ram_base + kernel_addr +
|
||||||
kernel_size + (1 << 20) - 1) & ~((1 << 20) - 1));
|
kernel_size + (1 << 20) - 1) & ~((1 << 20) - 1);
|
||||||
#else
|
#else
|
||||||
p = (void *)((uint32_t)phys_ram_base + kernel_addr + 0x400000);
|
p = phys_ram_base + kernel_addr + 0x400000;
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
sprintf(p, "console=ttyS0,9600 root=%02x%02x mem=%dM",
|
sprintf(p, "console=ttyS0,9600 root=%02x%02x mem=%dM",
|
||||||
|
Loading…
Reference in New Issue
Block a user