提交 561179c4 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

An IPI to configure event counters.

上级 5606f832
......@@ -130,6 +130,7 @@ int cpunum(void);
void lapicstartap(u8, u32 addr);
void lapiceoi(void);
void lapic_tlbflush(u32);
void lapic_sampconf(u32);
void lapicpc(char mask);
// mp.c
......@@ -227,6 +228,7 @@ void rcu_gc_worker(void);
void sampstart(void);
int sampintr(struct trapframe*);
void sampdump(void);
void sampconf(void);
// spinlock.c
void acquire(struct spinlock*);
......
......@@ -183,6 +183,12 @@ lapic_tlbflush(u32 cpu)
lapic_ipi(cpu, T_TLBFLUSH);
}
void
lapic_sampconf(u32 cpu)
{
lapic_ipi(cpu, T_SAMPCONF);
}
// Start additional processor running bootstrap code at addr.
// See Appendix B of MultiProcessor Specification.
void
......
......@@ -8,6 +8,7 @@
#include "kernel.h"
#include "bits.h"
#include "amd64.h"
#include "cpu.h"
static const u64 debug_sel =
0UL << 32 |
......@@ -87,13 +88,25 @@ sampdump(void)
}
void
sampstart(void)
sampconf(void)
{
pushcli();
pmu.config(0, debug_sel, -debug_cnt);
popcli();
}
void
sampstart(void)
{
for(struct cpu *c = cpus; c < cpus+ncpu; c++) {
if(c == cpus+cpunum())
continue;
lapic_sampconf(c->id);
}
sampconf();
}
static int
samplog(struct trapframe *tf)
{
......
......@@ -113,8 +113,10 @@ trap(struct trapframe *tf)
lapiceoi();
lcr3(rcr3());
break;
//PAGEBREAK: 13
case T_SAMPCONF:
lapiceoi();
sampconf();
break;
default:
if(myproc() == 0 || (tf->cs&3) == 0){
// In kernel, it must be our mistake.
......
......@@ -26,6 +26,7 @@
// processor defined exceptions or interrupt vectors.
#define T_SYSCALL 64 // system call
#define T_TLBFLUSH 65 // flush TLB
#define T_SAMPCONF 66 // configure event counters
#define T_DEFAULT 500 // catchall
#define T_IRQ0 32 // IRQ 0 corresponds to int T_IRQ
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论