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 mmap_max;
size_t stack_top;
size_t t0;
size_t time0;
size_t cycle0;
size_t instret0;
} elf_info;
extern elf_info current;

9
pk/pk.c

@ -13,7 +13,7 @@ static void handle_option(const char* s)
switch (s[1])
{
case 's': // print cycle count upon termination
current.t0 = 1;
current.cycle0 = 1;
break;
default:
@ -105,8 +105,11 @@ static void run_loaded_program(size_t argc, char** argv, uintptr_t kstack_top)
STACK_INIT(uintptr_t);
if (current.t0) // start timer if so requested
current.t0 = rdcycle();
if (current.cycle0) { // start timer if so requested
current.time0 = rdtime();
current.cycle0 = rdcycle();
current.instret0 = rdinstret();
}
trapframe_t tf;
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)
{
if (current.t0)
printk("%ld cycles\n", rdcycle() - current.t0);
if (current.cycle0) {
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);
}

Loading…
Cancel
Save