sb1250_prof.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2001 Broadcom Corporation
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. /*
  19.  *
  20.  * Definitions for the sb1250_prof pseudo device.
  21.  *
  22.  */
  23. //#include <sys/param.h>
  24. //#include <sys/device.h>
  25. #ifndef SB1250_PROF_H
  26. #define SB1250_PROF_H 1
  27. #define MAXCPUS 1
  28. #define NEWPIDSIZE 160
  29. /* The two definitions below must match those in pgather.c */
  30. #define MAX_COUNTERS 4
  31. #define MAX_SLOTS 8
  32. #define STATS
  33. typedef struct {
  34.   u_int8_t  event;
  35.   u_int8_t  hwcode;     /* pcarch-specific bits identifying desired event */
  36.   u_int64_t period;     /* 40-bit sampling period during slot */
  37. } sbprof_mux_counter_t;
  38. typedef struct {
  39.   sbprof_mux_counter_t
  40.                 counter[MAX_COUNTERS]; /* data for setting up counter */
  41.   u_int8_t n; /* number of counters to use in slot */
  42. } sbprof_mux_slot_t;
  43. typedef struct {
  44.   sbprof_mux_slot_t slots[MAX_SLOTS];
  45. } sbprof_mux_slots;
  46. typedef struct {
  47.   u_int64_t total; /* total number of interrupts */
  48.   u_int64_t dropped; /* total interrupts when buffers were full */
  49.   u_int64_t value; /* initial counter value when slot next entered */
  50.   u_int32_t start_period_low; /* counter val for starting a period */
  51.   u_int8_t  start_period_high;
  52.   u_int8_t  event;      /* pcarch-specific event_t */
  53.   u_int8_t  hwcode; /* pcarch-specific code for event */
  54.   u_int8_t  inuse; /* Is counter X slot actually used? */
  55. } event_counter_state_t;
  56. typedef struct {
  57.   u_int32_t total;  /* total for current run of slot */
  58.   u_int32_t dropped;  /* dropped for current run of slot */
  59.   u_int64_t start_period;/* counter value to start a full period */
  60. } active_counter_state_t;
  61. struct _cpudata1 {
  62.   /******* page-aligned boundary *********************************************/
  63.   u_int32_t last_pid; /* Pid for last sample in buffer (-1 initially) */
  64.   u_int8_t  curbuf; /* 2 -> both buffers full at end of last interrupt
  65.    1 -> use buffer[1]
  66.    0 -> use buffer[0] */
  67.   u_int8_t  nextbuf; /* the index of the next buffer to be filled */
  68.   u_int8_t  nnewpid[2]; /* number of entries set in new_pid[i] */
  69.   u_int32_t next;       /* index of next free entry in curbuf */
  70.   int32_t   last_event; /* index of byte just past last event DP_D_EVENTS
  71.    message in curbuf that needs the number of events
  72.    filled in.  -1 means there is no such message and
  73.    that such a message must be entered before
  74.    adding event samples.
  75.  */
  76.   /* 16-byte boundary */
  77.   volatile u_int32_t full[2];
  78.                         /* full[i] > 0 means buffer[i] needs emptying.
  79.    0 to nonzero done by sbprofintr().
  80.    nonzero to zero by sbprofioctl().
  81.    When nonzero, full[i] is the number of bytes
  82.    set in buffer[i].
  83. */
  84.   u_int32_t threshold;  /* when does the current multiplexing slot expire? */
  85.   u_int8_t slotid;      /* index into slots[] of current multiplexing slot */
  86.   u_int8_t nslots; /* number of slots */
  87.   u_int8_t needs_scan;
  88.   u_int8_t pad[1];
  89.   /******* 32-byte boundary *********************************************/
  90.   active_counter_state_t cur_slot[MAX_COUNTERS];
  91.   /******* 32-byte boundary *********************************************/
  92.   event_counter_state_t event_counter_state[MAX_SLOTS][MAX_COUNTERS];
  93.   /******* 32-byte boundary *********************************************/
  94.   u_int32_t overshot[MAX_SLOTS];
  95.   u_int32_t newpid[2][NEWPIDSIZE];  /* new_pid[i][] contains indices of
  96.        buffer[i][] where a new_pid message
  97.        is encoded and needs to have the
  98.        image_id, base addr, and num_inst
  99.        fields set by the user-level daemon */
  100. #ifdef STATS
  101.   u_int64_t newpidlimit;
  102.   u_int64_t buflimit;
  103. #endif
  104. };
  105. #define SBPROF_BUFSIZE (32*1024 - (sizeof(struct _cpudata1)+1)/2)
  106. typedef struct _cpudata {
  107.   struct _cpudata1 x;
  108.   u_int8_t buffer[2][SBPROF_BUFSIZE];
  109. } cpudata_t;
  110. #define SBPROF_START    _IOW('S', 0x1, sbprof_mux_slots)
  111. #define SBPROF_STOP     _IO('S', 0x2)
  112. #define SBPROF_BUFFULL  _IOWR('S', 0x3, int)
  113. #define SBPROF_BUFEMPTY _IOW('S', 0x4, int)
  114. #if NEWPIDSIZE > 254
  115. #error "newpidsize too big"
  116. #endif
  117. #endif /* SB1250_PROF_H */