Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
636aa70a
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,发现更多精彩内容 >>
提交
636aa70a
编写于
7月 21, 2009
作者:
B
Blue Swirl
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Sparc64: refactor kernel init
Signed-off-by:
N
Blue Swirl
<
blauwirbel@gmail.com
>
上级
7b833f5b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
55 addition
and
42 deletion
+55
-42
hw/sun4u.c
hw/sun4u.c
+55
-42
未找到文件。
hw/sun4u.c
浏览文件 @
636aa70a
...
...
@@ -148,6 +148,56 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
return
0
;
}
static
unsigned
long
sun4u_load_kernel
(
const
char
*
kernel_filename
,
const
char
*
initrd_filename
,
ram_addr_t
RAM_size
,
long
*
initrd_size
)
{
int
linux_boot
;
unsigned
int
i
;
long
kernel_size
;
linux_boot
=
(
kernel_filename
!=
NULL
);
kernel_size
=
0
;
if
(
linux_boot
)
{
kernel_size
=
load_elf
(
kernel_filename
,
0
,
NULL
,
NULL
,
NULL
);
if
(
kernel_size
<
0
)
kernel_size
=
load_aout
(
kernel_filename
,
KERNEL_LOAD_ADDR
,
RAM_size
-
KERNEL_LOAD_ADDR
);
if
(
kernel_size
<
0
)
kernel_size
=
load_image_targphys
(
kernel_filename
,
KERNEL_LOAD_ADDR
,
RAM_size
-
KERNEL_LOAD_ADDR
);
if
(
kernel_size
<
0
)
{
fprintf
(
stderr
,
"qemu: could not load kernel '%s'
\n
"
,
kernel_filename
);
exit
(
1
);
}
/* load initrd */
*
initrd_size
=
0
;
if
(
initrd_filename
)
{
*
initrd_size
=
load_image_targphys
(
initrd_filename
,
INITRD_LOAD_ADDR
,
RAM_size
-
INITRD_LOAD_ADDR
);
if
(
*
initrd_size
<
0
)
{
fprintf
(
stderr
,
"qemu: could not load initial ram disk '%s'
\n
"
,
initrd_filename
);
exit
(
1
);
}
}
if
(
*
initrd_size
>
0
)
{
for
(
i
=
0
;
i
<
64
*
TARGET_PAGE_SIZE
;
i
+=
TARGET_PAGE_SIZE
)
{
if
(
ldl_phys
(
KERNEL_LOAD_ADDR
+
i
)
==
0x48647253
)
{
// HdrS
stl_phys
(
KERNEL_LOAD_ADDR
+
i
+
16
,
INITRD_LOAD_ADDR
);
stl_phys
(
KERNEL_LOAD_ADDR
+
i
+
20
,
*
initrd_size
);
break
;
}
}
}
}
return
kernel_size
;
}
void
pic_info
(
Monitor
*
mon
)
{
...
...
@@ -503,7 +553,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
{
CPUState
*
env
;
m48t59_t
*
nvram
;
int
linux_boot
;
unsigned
int
i
;
long
initrd_size
,
kernel_size
;
PCIBus
*
pci_bus
,
*
pci_bus2
,
*
pci_bus3
;
...
...
@@ -513,8 +562,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
BlockDriverState
*
fd
[
MAX_FD
];
void
*
fw_cfg
;
linux_boot
=
(
kernel_filename
!=
NULL
);
/* init CPUs */
env
=
cpu_devinit
(
cpu_model
,
hwdef
);
...
...
@@ -523,45 +570,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
prom_init
(
hwdef
->
prom_addr
,
bios_name
);
kernel_size
=
0
;
initrd_size
=
0
;
if
(
linux_boot
)
{
/* XXX: put correct offset */
kernel_size
=
load_elf
(
kernel_filename
,
0
,
NULL
,
NULL
,
NULL
);
if
(
kernel_size
<
0
)
kernel_size
=
load_aout
(
kernel_filename
,
KERNEL_LOAD_ADDR
,
ram_size
-
KERNEL_LOAD_ADDR
);
if
(
kernel_size
<
0
)
kernel_size
=
load_image_targphys
(
kernel_filename
,
KERNEL_LOAD_ADDR
,
ram_size
-
KERNEL_LOAD_ADDR
);
if
(
kernel_size
<
0
)
{
fprintf
(
stderr
,
"qemu: could not load kernel '%s'
\n
"
,
kernel_filename
);
exit
(
1
);
}
/* load initrd */
if
(
initrd_filename
)
{
initrd_size
=
load_image_targphys
(
initrd_filename
,
INITRD_LOAD_ADDR
,
ram_size
-
INITRD_LOAD_ADDR
);
if
(
initrd_size
<
0
)
{
fprintf
(
stderr
,
"qemu: could not load initial ram disk '%s'
\n
"
,
initrd_filename
);
exit
(
1
);
}
}
if
(
initrd_size
>
0
)
{
for
(
i
=
0
;
i
<
64
*
TARGET_PAGE_SIZE
;
i
+=
TARGET_PAGE_SIZE
)
{
if
(
ldl_phys
(
KERNEL_LOAD_ADDR
+
i
)
==
0x48647253
)
{
// HdrS
stl_phys
(
KERNEL_LOAD_ADDR
+
i
+
16
,
INITRD_LOAD_ADDR
);
stl_phys
(
KERNEL_LOAD_ADDR
+
i
+
20
,
initrd_size
);
break
;
}
}
}
}
irq
=
qemu_allocate_irqs
(
cpu_set_irq
,
env
,
MAX_PILS
);
pci_bus
=
pci_apb_init
(
APB_SPECIAL_BASE
,
APB_MEM_BASE
,
irq
,
&
pci_bus2
,
...
...
@@ -621,6 +629,11 @@ static void sun4uv_init(ram_addr_t RAM_size,
}
floppy_controller
=
fdctrl_init
(
NULL
/*6*/
,
2
,
0
,
0x3f0
,
fd
);
nvram
=
m48t59_init
(
NULL
/*8*/
,
0
,
0x0074
,
NVRAM_SIZE
,
59
);
initrd_size
=
0
;
kernel_size
=
sun4u_load_kernel
(
kernel_filename
,
initrd_filename
,
ram_size
,
&
initrd_size
);
sun4u_NVRAM_set_params
(
nvram
,
NVRAM_SIZE
,
"Sun4u"
,
RAM_size
,
boot_devices
,
KERNEL_LOAD_ADDR
,
kernel_size
,
kernel_cmdline
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录