Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
nexus-am
提交
1ae8fb4a
N
nexus-am
项目概览
OpenXiangShan
/
nexus-am
10 个月 前同步成功
通知
0
Star
21
Fork
25
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nexus-am
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1ae8fb4a
编写于
7月 05, 2022
作者:
X
XiChen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hpmdriver: add macro functions
上级
f7432606
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
70 addition
and
19 deletion
+70
-19
apps/hpmdriver/events.h
apps/hpmdriver/events.h
+1
-0
apps/hpmdriver/hpmdriver.c
apps/hpmdriver/hpmdriver.c
+17
-1
apps/hpmdriver/hpmdriver.h
apps/hpmdriver/hpmdriver.h
+52
-18
未找到文件。
apps/hpmdriver/events.h
浏览文件 @
1ae8fb4a
#ifndef __EVENTS_H__
#define __EVENTS_H__
#define noEvent 0
#define Frontend_noEvent 0
#define Frontend_frontendFlush 1
#define Frontend_ifu_req 2
...
...
apps/hpmdriver/hpmdriver.c
浏览文件 @
1ae8fb4a
...
...
@@ -12,7 +12,23 @@ int main() {
printf
(
"mcycle: %ld
\n
"
,
csr_read
(
mcycle
));
printf
(
"minstret: %ld
\n
"
,
csr_read
(
minstret
));
#if 1
se_cc_single
(
3
,
MODE_M
,
Frontend_frontendFlush
);
se_cc_single
(
11
,
MODE_M
,
Frontend_frontendFlush
);
// === tmp workload ===
volatile
uint64_t
a
=
0
;
for
(
uint64_t
i
=
0
;
i
<
100
;
i
++
)
{
a
+=
a
+
i
;
}
printf
(
"%lu
\n
"
,
a
);
// *** tmp workload ***
print_event
(
3
);
print_counter
(
3
);
print_event
(
11
);
print_counter
(
11
);
#if 0
uint64_t set_mode_M = (0x1UL << 63);
// ===== frontend ==================================================
csr_write(mhpmevent3, csr_read(mhpmevent3)|set_mode_M);
...
...
apps/hpmdriver/hpmdriver.h
浏览文件 @
1ae8fb4a
...
...
@@ -6,34 +6,68 @@
#include "events.h"
#define MODE_OFFSET 59
#define MODE_MASK 0x1F
UL
#define MODE_M 0x10
UL
#define MODE_H 0x08
UL
#define MODE_S 0x04
UL
#define MODE_U 0x02
UL
#define MODE_D 0x01
UL
#define MODE_MASK 0x1F
#define MODE_M 0x10
#define MODE_H 0x08
#define MODE_S 0x04
#define MODE_U 0x02
#define MODE_D 0x01
#define OPTYPE2_OFFSET 50
#define OPTYPE2_MASK 0x1F
UL
#define OPTYPE2_MASK 0x1F
#define OPTYPE1_OFFSET 45
#define OPTYPE1_MASK 0x1F
UL
#define OPTYPE1_MASK 0x1F
#define OPTYPE0_OFFSET 40
#define OPTYPE0_MASK 0x1F
UL
#define OPTYPE_OR 0x0
UL
#define OPTYPE_AND 0x1
UL
#define OPTYPE_XOR 0x2
UL
#define OPTYPE_ADD 0x4
UL
#define OPTYPE0_MASK 0x1F
#define OPTYPE_OR 0x0
#define OPTYPE_AND 0x1
#define OPTYPE_XOR 0x2
#define OPTYPE_ADD 0x4
#define EVENT3_OFFSET 30
#define EVENT3_MASK 0x3FF
UL
#define EVENT3_MASK 0x3FF
#define EVENT2_OFFSET 20
#define EVENT2_MASK 0x3FF
UL
#define EVENT2_MASK 0x3FF
#define EVENT1_OFFSET 10
#define EVENT1_MASK 0x3FF
UL
#define EVENT1_MASK 0x3FF
#define EVENT0_OFFSET 0
#define EVENT0_MASK 0x3FFUL
#define EVENT0_MASK 0x3FF
#define SET(reg, field, value) (reg) = ((reg) & ~((uint64_t)(field##_MASK) << (field##_OFFSET))) | ((uint64_t)(value) << (field##_OFFSET));
#define clear_event(id) csr_write(mhpmevent##id, 0x0UL)
#define print_event(id) printf("mhpmevent%d: %lx\n", id, csr_read(mhpmevent##id))
#define clear_counter(id) csr_write(mhpmcounter##id, 0x0UL)
#define print_counter(id) printf("mhpmcounter%d: %lu\n", id, csr_read(mhpmcounter##id))
#define set_event_quad(csr_id, mode, optype2, optype1, optype0, event3, event2, event1, event0) \
{ \
uint64_t value = csr_read(mhpmevent##csr_id); \
SET(value, MODE, mode); \
SET(value, OPTYPE2, optype2); \
SET(value, OPTYPE1, optype1); \
SET(value, OPTYPE0, optype0); \
SET(value, EVENT3, event3); \
SET(value, EVENT2, event2); \
SET(value, EVENT1, event1); \
SET(value, EVENT0, event0); \
csr_write(mhpmevent##csr_id, value); \
}
#define set_event_double(csr_id, mode, optype0, event1, event0) \
set_event_quad(csr_id, mode, OPTYPE_OR, OPTYPE_OR, optype0, noEvent, noEvent, event1, event0)
#define set_event_single(csr_id, mode, event)\
set_event_quad(csr_id, mode, OPTYPE_OR, OPTYPE_OR, OPTYPE_OR, noEvent, noEvent, noEvent, event)
// set event and clear counter
#define se_cc_quad(csr_id, mode, optype2, optype1, optype0, event3, event2, event1, event0) \
{set_event_quad(csr_id, mode, optype2, optype1, optype0, event3, event2, event1, event0);clear_counter(csr_id);}
#define se_cc_double(csr_id, mode, optype0, event1, event0) \
{set_event_double(csr_id, mode, optype0, event1, event0);clear_counter(csr_id);}
#define se_cc_single(csr_id, mode, event) \
{set_event_single(csr_id, mode, event);clear_counter(csr_id);}
#define SET(reg, field, value) ((reg) = ((reg) & ~((field##_MASK) << (field##_OFFSET))) | ((value) << (field##_OFFSET)));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录