Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
1baffa46
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1baffa46
编写于
7月 21, 2009
作者:
B
Blue Swirl
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Sparc64: convert boot prom to qdev
Signed-off-by:
N
Blue Swirl
<
blauwirbel@gmail.com
>
上级
daa65491
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
62 addition
and
29 deletion
+62
-29
hw/sun4u.c
hw/sun4u.c
+62
-29
未找到文件。
hw/sun4u.c
浏览文件 @
1baffa46
...
...
@@ -32,6 +32,7 @@
#include "boards.h"
#include "firmware_abi.h"
#include "fw_cfg.h"
#include "sysbus.h"
//#define DEBUG_IRQ
...
...
@@ -342,6 +343,64 @@ static void pci_ebus_register(void)
device_init
(
pci_ebus_register
);
/* Boot PROM (OpenBIOS) */
static
void
prom_init
(
target_phys_addr_t
addr
,
const
char
*
bios_name
)
{
DeviceState
*
dev
;
SysBusDevice
*
s
;
char
*
filename
;
int
ret
;
dev
=
qdev_create
(
NULL
,
"openprom"
);
qdev_init
(
dev
);
s
=
sysbus_from_qdev
(
dev
);
sysbus_mmio_map
(
s
,
0
,
addr
);
/* load boot prom */
if
(
bios_name
==
NULL
)
{
bios_name
=
PROM_FILENAME
;
}
filename
=
qemu_find_file
(
QEMU_FILE_TYPE_BIOS
,
bios_name
);
if
(
filename
)
{
ret
=
load_elf
(
filename
,
addr
-
PROM_VADDR
,
NULL
,
NULL
,
NULL
);
if
(
ret
<
0
||
ret
>
PROM_SIZE_MAX
)
{
ret
=
load_image_targphys
(
filename
,
addr
,
PROM_SIZE_MAX
);
}
qemu_free
(
filename
);
}
else
{
ret
=
-
1
;
}
if
(
ret
<
0
||
ret
>
PROM_SIZE_MAX
)
{
fprintf
(
stderr
,
"qemu: could not load prom '%s'
\n
"
,
bios_name
);
exit
(
1
);
}
}
static
void
prom_init1
(
SysBusDevice
*
dev
)
{
ram_addr_t
prom_offset
;
prom_offset
=
qemu_ram_alloc
(
PROM_SIZE_MAX
);
sysbus_init_mmio
(
dev
,
PROM_SIZE_MAX
,
prom_offset
|
IO_MEM_ROM
);
}
static
SysBusDeviceInfo
prom_info
=
{
.
init
=
prom_init1
,
.
qdev
.
name
=
"openprom"
,
.
qdev
.
size
=
sizeof
(
SysBusDevice
),
.
qdev
.
props
=
(
Property
[])
{
{
/* end of property list */
}
}
};
static
void
prom_register_devices
(
void
)
{
sysbus_register_withprop
(
&
prom_info
);
}
device_init
(
prom_register_devices
);
static
void
sun4uv_init
(
ram_addr_t
RAM_size
,
const
char
*
boot_devices
,
const
char
*
kernel_filename
,
const
char
*
kernel_cmdline
,
...
...
@@ -349,11 +408,10 @@ static void sun4uv_init(ram_addr_t RAM_size,
const
struct
hwdef
*
hwdef
)
{
CPUState
*
env
;
char
*
filename
;
m48t59_t
*
nvram
;
int
ret
,
linux_boot
;
int
linux_boot
;
unsigned
int
i
;
ram_addr_t
ram_offset
,
prom_offset
;
ram_addr_t
ram_offset
;
long
initrd_size
,
kernel_size
;
PCIBus
*
pci_bus
,
*
pci_bus2
,
*
pci_bus3
;
QEMUBH
*
bh
;
...
...
@@ -400,32 +458,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
ram_offset
=
qemu_ram_alloc
(
RAM_size
);
cpu_register_physical_memory
(
0
,
RAM_size
,
ram_offset
);
prom_offset
=
qemu_ram_alloc
(
PROM_SIZE_MAX
);
cpu_register_physical_memory
(
hwdef
->
prom_addr
,
(
PROM_SIZE_MAX
+
TARGET_PAGE_SIZE
)
&
TARGET_PAGE_MASK
,
prom_offset
|
IO_MEM_ROM
);
if
(
bios_name
==
NULL
)
bios_name
=
PROM_FILENAME
;
filename
=
qemu_find_file
(
QEMU_FILE_TYPE_BIOS
,
bios_name
);
if
(
filename
)
{
ret
=
load_elf
(
filename
,
hwdef
->
prom_addr
-
PROM_VADDR
,
NULL
,
NULL
,
NULL
);
if
(
ret
<
0
)
{
ret
=
load_image_targphys
(
filename
,
hwdef
->
prom_addr
,
(
PROM_SIZE_MAX
+
TARGET_PAGE_SIZE
)
&
TARGET_PAGE_MASK
);
}
qemu_free
(
filename
);
}
else
{
ret
=
-
1
;
}
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"qemu: could not load prom '%s'
\n
"
,
bios_name
);
exit
(
1
);
}
prom_init
(
hwdef
->
prom_addr
,
bios_name
);
kernel_size
=
0
;
initrd_size
=
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录