1/* 2 * Copyright 2014, Michael Ellerman, IBM Corp. 3 * Licensed under GPLv2. 4 */ 5 6#include <signal.h> 7#include <stdio.h> 8#include <stdlib.h> 9#include <stdbool.h> 10#include <sys/types.h> 11#include <sys/wait.h> 12#include <unistd.h> 13#include <setjmp.h> 14#include <signal.h> 15 16#include "ebb.h" 17 18 19/* 20 * Test that a fork clears the PMU state of the child. eg. BESCR/EBBHR/EBBRR 21 * are cleared, and MMCR0_PMCC is reset, preventing the child from accessing 22 * the PMU. 23 */ 24 25static struct event event; 26 27static int child(void) 28{ 29 /* Even though we have EBE=0 we can still see the EBB regs */ 30 FAIL_IF(mfspr(SPRN_BESCR) != 0); 31 FAIL_IF(mfspr(SPRN_EBBHR) != 0); 32 FAIL_IF(mfspr(SPRN_EBBRR) != 0); 33 34 FAIL_IF(catch_sigill(write_pmc1)); 35 36 /* We can still read from the event, though it is on our parent */ 37 FAIL_IF(event_read(&event)); 38 39 return 0; 40} 41 42/* Tests that fork clears EBB state */ 43int fork_cleanup(void) 44{ 45 pid_t pid; 46 47 event_init_named(&event, 0x1001e, "cycles"); 48 event_leader_ebb_init(&event); 49 50 FAIL_IF(event_open(&event)); 51 52 ebb_enable_pmc_counting(1); 53 setup_ebb_handler(standard_ebb_callee); 54 ebb_global_enable(); 55 56 FAIL_IF(ebb_event_enable(&event)); 57 58 mtspr(SPRN_MMCR0, MMCR0_FC); 59 mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); 60 61 /* Don't need to actually take any EBBs */ 62 63 pid = fork(); 64 if (pid == 0) 65 exit(child()); 66 67 /* Child does the actual testing */ 68 FAIL_IF(wait_for_child(pid)); 69 70 /* After fork */ 71 event_close(&event); 72 73 return 0; 74} 75 76int main(void) 77{ 78 return test_harness(fork_cleanup, "fork_cleanup"); 79} 80