Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
d38cd35c
提交
d38cd35c
4月 19, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ACPI code to read 32-bit APIC IDs.
:(
上级
a8efbd38
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
190 行增加
和
0 行删除
+190
-0
Makefrag
kernel/Makefrag
+1
-0
acpi.cc
kernel/acpi.cc
+189
-0
没有找到文件。
kernel/Makefrag
浏览文件 @
d38cd35c
OBJS = \
acpi.o \
async.o \
bio.o \
bootdata.o \
...
...
kernel/acpi.cc
0 → 100644
浏览文件 @
d38cd35c
#include "types.h"
#include "amd64.h"
#include "kernel.hh"
#include "cpu.hh"
#include "apic.hh"
struct
rsdp
{
u8
signature
[
8
];
u8
checksum
;
u8
oemid
[
6
];
u8
revision
;
u32
rsdtaddr
;
u32
length
;
u64
xsdtaddr
;
u8
extchecksum
;
u8
reserved
[
3
];
};
struct
header
{
u8
signature
[
4
];
u32
length
;
u8
revision
;
u8
checksum
;
u8
oemid
[
6
];
u8
oemtableid
[
8
];
u32
oemrevision
;
u32
creatorid
;
u32
creatorrevision
;
};
struct
rsdt
{
struct
header
hdr
;
u32
entry
[];
};
struct
xsdt
{
struct
header
hdr
;
u64
entry
[];
}
__attribute__
((
packed
));
struct
madt
{
struct
header
hdr
;
u32
localaddr
;
u32
flags
;
u8
entry
[];
};
struct
madt_apic
{
u8
type
;
u8
length
;
u8
procid
;
u8
apicid
;
u32
flags
;
}
__attribute__
((
packed
));
struct
madt_x2apic
{
u8
type
;
u8
length
;
u8
reserved
[
2
];
u32
apicid
;
u32
flags
;
u32
procuid
;
}
__attribute__
((
packed
));
#define CPU_ENABLED 0x1
static
u8
sum
(
u8
*
a
,
u32
length
)
{
u8
s
=
0
;
for
(
u32
i
=
0
;
i
<
length
;
i
++
)
s
+=
a
[
i
];
return
s
;
}
static
struct
rsdp
*
rsdp_search1
(
paddr
pa
,
int
len
)
{
u8
*
start
=
(
u8
*
)
p2v
(
pa
);
for
(
u8
*
p
=
start
;
p
<
(
start
+
len
);
p
+=
16
)
{
if
((
memcmp
(
p
,
"RSD PTR "
,
8
)
==
0
)
&&
(
sum
(
p
,
20
)
==
0
))
return
(
struct
rsdp
*
)
p
;
}
return
0
;
}
static
struct
rsdp
*
rsdp_search
(
void
)
{
struct
rsdp
*
ret
;
u8
*
bda
;
paddr
pa
;
bda
=
(
u8
*
)
p2v
(
0x400
);
if
((
pa
=
((
bda
[
0x0F
]
<<
8
)
|
bda
[
0x0E
])
<<
4
))
{
if
((
ret
=
rsdp_search1
(
pa
,
1024
)))
return
ret
;
}
return
rsdp_search1
(
0xE0000
,
0x20000
);
}
static
void
scan_madt
(
struct
madt
*
madt
)
{
struct
madt_x2apic
*
mx2
;
struct
madt_apic
*
ma
;
u8
*
type
;
u8
*
end
;
u32
c
;
end
=
((
u8
*
)
madt
)
+
madt
->
hdr
.
length
;
type
=
((
u8
*
)
madt
)
+
sizeof
(
*
madt
);
c
=
0
==
myid
()
?
1
:
0
;
while
(
type
<
end
)
{
s64
id
=
-
1
;
switch
(
type
[
0
])
{
case
0
:
// Processor Local APIC
ma
=
(
struct
madt_apic
*
)
type
;
if
(
ma
->
flags
&
CPU_ENABLED
)
id
=
ma
->
apicid
;
break
;
case
9
:
// Processor Local x2APIC
mx2
=
(
struct
madt_x2apic
*
)
type
;
if
(
mx2
->
flags
&
CPU_ENABLED
)
id
=
mx2
->
apicid
;
break
;
}
if
(
id
!=
-
1
&&
id
!=
lapicid
().
num
)
{
assert
(
c
<
NCPU
);
if
(
VERBOSE
)
cprintf
(
"%u from %u to %ld
\n
"
,
c
,
cpus
[
c
].
hwid
.
num
,
id
);
cpus
[
c
].
hwid
.
num
=
id
;
c
=
c
+
1
==
myid
()
?
c
+
2
:
c
+
1
;
}
type
=
type
+
type
[
1
];
}
}
void
initacpi
(
void
)
{
struct
rsdp
*
rsdp
=
rsdp_search
();
struct
madt
*
madt
=
nullptr
;
if
(
!
rsdp
)
return
;
if
(
rsdp
->
xsdtaddr
)
{
struct
xsdt
*
xsdt
=
(
struct
xsdt
*
)
p2v
(
rsdp
->
xsdtaddr
);
if
(
sum
((
u8
*
)
xsdt
,
xsdt
->
hdr
.
length
))
{
cprintf
(
"initacpi: bad xsdt checksum
\n
"
);
return
;
}
u32
n
=
xsdt
->
hdr
.
length
>
sizeof
(
*
xsdt
)
?
(
xsdt
->
hdr
.
length
-
sizeof
(
*
xsdt
))
/
8
:
0
;
for
(
u32
i
=
0
;
i
<
n
;
i
++
)
{
struct
header
*
h
=
(
struct
header
*
)
p2v
(
xsdt
->
entry
[
i
]);
if
(
memcmp
(
h
->
signature
,
"APIC"
,
4
)
==
0
)
{
madt
=
(
struct
madt
*
)
h
;
break
;
}
}
}
else
{
struct
rsdt
*
rsdt
=
(
struct
rsdt
*
)
p2v
(
rsdp
->
rsdtaddr
);
if
(
sum
((
u8
*
)
rsdt
,
rsdt
->
hdr
.
length
))
{
cprintf
(
"initacpi: bad rsdt checksum
\n
"
);
return
;
}
u32
n
=
rsdt
->
hdr
.
length
>
sizeof
(
*
rsdt
)
?
(
rsdt
->
hdr
.
length
-
sizeof
(
*
rsdt
))
/
8
:
0
;
for
(
u32
i
=
0
;
i
<
n
;
i
++
)
{
struct
header
*
h
=
(
struct
header
*
)
p2v
(
rsdt
->
entry
[
i
]);
if
(
memcmp
(
h
->
signature
,
"APIC"
,
4
)
==
0
)
{
madt
=
(
struct
madt
*
)
h
;
break
;
}
}
}
if
(
madt
!=
nullptr
)
scan_madt
(
madt
);
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论