Browse Source

when -s is passed, print time, instret, cycle, and CPI

pull/32/head
Andrew Waterman 10 years ago
parent
commit
0a7862c79f
  1. 4
      pk/boot.h
  2. 9
      pk/pk.c
  3. 12
      pk/syscall.c

4
pk/boot.h

@ -20,7 +20,9 @@ typedef struct {
size_t brk_max; size_t brk_max;
size_t mmap_max; size_t mmap_max;
size_t stack_top; size_t stack_top;
size_t t0; size_t time0;
size_t cycle0;
size_t instret0;
} elf_info; } elf_info;
extern elf_info current; extern elf_info current;

9
pk/pk.c

@ -13,7 +13,7 @@ static void handle_option(const char* s)
switch (s[1]) switch (s[1])
{ {
case 's': // print cycle count upon termination case 's': // print cycle count upon termination
current.t0 = 1; current.cycle0 = 1;
break; break;
default: default:
@ -105,8 +105,11 @@ static void run_loaded_program(size_t argc, char** argv, uintptr_t kstack_top)
STACK_INIT(uintptr_t); STACK_INIT(uintptr_t);
if (current.t0) // start timer if so requested if (current.cycle0) { // start timer if so requested
current.t0 = rdcycle(); current.time0 = rdtime();
current.cycle0 = rdcycle();
current.instret0 = rdinstret();
}
trapframe_t tf; trapframe_t tf;
init_tf(&tf, current.entry, stack_top); init_tf(&tf, current.entry, stack_top);

12
pk/syscall.c

@ -15,8 +15,16 @@ typedef long (*syscall_t)(long, long, long, long, long, long, long);
void sys_exit(int code) void sys_exit(int code)
{ {
if (current.t0) if (current.cycle0) {
printk("%ld cycles\n", rdcycle() - current.t0); size_t dt = rdtime() - current.time0;
size_t dc = rdcycle() - current.cycle0;
size_t di = rdinstret() - current.instret0;
printk("%ld ticks\n", dt);
printk("%ld cycles\n", dc);
printk("%ld instructions\n", di);
printk("%d.%d%d CPI\n", dc/di, 10ULL*dc/di % 10, (100ULL*dc + di/2)/di % 10);
}
shutdown(code); shutdown(code);
} }

Loading…
Cancel
Save