Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/Documentation/prctl/disable-tsc-on-off-stress-test.c (Version 2.6.31.13) and /linux/Documentation/prctl/disable-tsc-on-off-stress-test.c (Version 2.6.25)


  1 /*                                                  1 
  2  * Tests for prctl(PR_GET_TSC, ...) / prctl(PR    
  3  *                                                
  4  * Tests if the control register is updated co    
  5  * when set with prctl()                          
  6  *                                                
  7  * Warning: this test will cause a very high l    
  8  *                                                
  9  */                                               
 10                                                   
 11 #include <stdio.h>                                
 12 #include <stdlib.h>                               
 13 #include <unistd.h>                               
 14 #include <signal.h>                               
 15 #include <inttypes.h>                             
 16 #include <wait.h>                                 
 17                                                   
 18                                                   
 19 #include <sys/prctl.h>                            
 20 #include <linux/prctl.h>                          
 21                                                   
 22 /* Get/set the process' ability to use the tim    
 23 #ifndef PR_GET_TSC                                
 24 #define PR_GET_TSC 25                             
 25 #define PR_SET_TSC 26                             
 26 # define PR_TSC_ENABLE          1   /* allow t    
 27 # define PR_TSC_SIGSEGV         2   /* throw a    
 28 #endif                                            
 29                                                   
 30 /* snippet from wikipedia :-) */                  
 31                                                   
 32 uint64_t rdtsc() {                                
 33 uint32_t lo, hi;                                  
 34 /* We cannot use "=A", since this would use %r    
 35 __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d    
 36 return (uint64_t)hi << 32 | lo;                   
 37 }                                                 
 38                                                   
 39 int should_segv = 0;                              
 40                                                   
 41 void sigsegv_cb(int sig)                          
 42 {                                                 
 43         if (!should_segv)                         
 44         {                                         
 45                 fprintf(stderr, "FATAL ERROR,     
 46                 exit(0);                          
 47         }                                         
 48         if (prctl(PR_SET_TSC, PR_TSC_ENABLE) <    
 49         {                                         
 50                 perror("prctl");                  
 51                 exit(0);                          
 52         }                                         
 53         should_segv = 0;                          
 54                                                   
 55         rdtsc();                                  
 56 }                                                 
 57                                                   
 58 void task(void)                                   
 59 {                                                 
 60         signal(SIGSEGV, sigsegv_cb);              
 61         alarm(10);                                
 62         for(;;)                                   
 63         {                                         
 64                 rdtsc();                          
 65                 if (should_segv)                  
 66                 {                                 
 67                         fprintf(stderr, "FATAL    
 68                         exit(0);                  
 69                 }                                 
 70                 if (prctl(PR_SET_TSC, PR_TSC_S    
 71                 {                                 
 72                         perror("prctl");          
 73                         exit(0);                  
 74                 }                                 
 75                 should_segv = 1;                  
 76         }                                         
 77 }                                                 
 78                                                   
 79                                                   
 80 int main(int argc, char **argv)                   
 81 {                                                 
 82         int n_tasks = 100, i;                     
 83                                                   
 84         fprintf(stderr, "[No further output me    
 85                                                   
 86         for (i=0; i<n_tasks; i++)                 
 87                 if (fork() == 0)                  
 88                         task();                   
 89                                                   
 90         for (i=0; i<n_tasks; i++)                 
 91                 wait(NULL);                       
 92                                                   
 93         exit(0);                                  
 94 }                                                 
 95                                                   
 96                                                   
  This page was automatically generated by the LXR engine.