hackedteam/driver-macos

View on GitHub
task_internal.h

Summary

Maintainability
Test Coverage
/*
 *  task_internal.h
 *  mchook
 *
 *  Created by revenge on 9/23/10.
 *  Copyright 2010 HT srl. All rights reserved.
 *
 */

#define queue_first(q)    ((q)->next)
#define queue_next(qc)    ((qc)->next)
#define queue_end(q, qe)  ((q) == (qe))

struct queue_entry {
  struct queue_entry  *next;    /* next element */
  struct queue_entry  *prev;    /* previous element */
};

typedef    struct queue_entry *queue_entry_t;
typedef struct queue_entry queue_chain_t;
typedef struct queue_entry queue_head_t;

//extern queue_head_t   tasks;

/*
 * Common storage for exception actions.
 * There are arrays of these maintained at the activation, task, and host.
 */
struct exception_action {
  struct ipc_port        *port;        /* exception port */
  thread_state_flavor_t    flavor;        /* state flavor to send */
  exception_behavior_t    behavior;    /* exception type to raise */
  boolean_t        privileged;    /* survives ipc_task_reset */
};

/*
 * Real segment descriptor.
 */
struct real_descriptor {
  uint32_t  limit_low:16, /* limit 0..15 */
            base_low:16,  /* base  0..15 */
            base_med:8,   /* base  16..23 */
            access:8,     /* access byte */
            limit_high:4, /* limit 16..19 */
            granularity:4,/* granularity */
            base_high:8;  /* base 24..31 */
};

struct user_ldt {
  unsigned int start;   /* first descriptor in table */
  unsigned int count;   /* how many descriptors in table */
  struct real_descriptor ldt[0]; /* descriptor table (variable) */
};

#define    MAC_MAX_SLOTS    7

struct label {
  int l_flags;
  union {
    void  *l_ptr;
    long   l_long;
  } l_perpolicy[MAC_MAX_SLOTS];
};

typedef struct ipc_labelh
{
  natural_t         lh_references;
  int               lh_type;
  struct label      lh_label;
  ipc_port_t        lh_port;
  //decl_lck_mtx_data(, lh_lock_data)
  uint32_t lh_lock_data[1];
} *ipc_labelh_t; 


#define MACHINE_TASK \
        struct user_ldt *i386_ldt; \
        void*       task_debug;

#define TASK_PORT_REGISTER_MAX    3

#define task_lock(task)         lck_mtx_lock(&(task)->lock)
#define task_unlock(task)       lck_mtx_unlock(&(task)->lock)

struct task {
  /* Synchronization/destruction information */
  //decl_lck_mtx_data(,lock)        /* Task's lock */
  //lck_mtx_t   *lock;
  uint32_t    lock;
  uint32_t    pad_lock; // leopard/snow padding

  uint32_t    ref_count;    /* Number of references to me */
  boolean_t    active;        /* Task has not been terminated */
  boolean_t    halting;    /* Task is being halted */

  /* Miscellaneous */
  vm_map_t    map;        /* Address space description */
  
  uint32_t pad_tasks; // snow leopard padding
  
  queue_chain_t    tasks;    /* global list of tasks */
  void        *user_data;    /* Arbitrary data settable via IPC */

  /* Threads in this task */
  queue_head_t        threads;

  processor_set_t        pset_hint;
  struct affinity_space    *affinity_space;
  
  int            thread_count;
  uint32_t        active_thread_count;
  int            suspend_count;    /* Internal scheduling only */

  /* User-visible scheduling information */
  integer_t        user_stop_count;    /* outstanding stops */

  task_role_t        role;

  integer_t        priority;            /* base priority for threads */
  integer_t        max_priority;        /* maximum priority for threads */

  /* Task security and audit tokens */
  security_token_t sec_token;
  audit_token_t    audit_token;

  /* Statistics */
  uint64_t        total_user_time;    /* terminated threads only */
  uint64_t        total_system_time;

  /* Virtual timers */
  uint32_t        vtimers;

  /* IPC structures */
  //decl_lck_mtx_data(,itk_lock_data)
  uint32_t itk_lock_data[1];
  struct ipc_port *itk_self;    /* not a right, doesn't hold ref */
  struct ipc_port *itk_nself;    /* not a right, doesn't hold ref */
  struct ipc_port *itk_sself;    /* a send right */
  struct exception_action exc_actions[EXC_TYPES_COUNT];
  /* a send right each valid element  */
  struct ipc_port *itk_host;    /* a send right */
  struct ipc_port *itk_bootstrap;    /* a send right */
  struct ipc_port *itk_seatbelt;    /* a send right */
  struct ipc_port *itk_gssd;    /* yet another send right */
  struct ipc_port *itk_task_access; /* and another send right */ 
  struct ipc_port *itk_registered[TASK_PORT_REGISTER_MAX];
  /* all send rights */

  struct ipc_space *itk_space;

  /* Synchronizer ownership information */
  queue_head_t    semaphore_list;        /* list of owned semaphores   */
  queue_head_t    lock_set_list;        /* list of owned lock sets    */
  int        semaphores_owned;    /* number of semaphores owned */
  int         lock_sets_owned;    /* number of lock sets owned  */

  /* Ledgers */
  struct ipc_port    *wired_ledger_port;
  struct ipc_port *paged_ledger_port;
  unsigned int    priv_flags;            /* privilege resource flags */
#define VM_BACKING_STORE_PRIV    0x1
  
  MACHINE_TASK
  
  integer_t faults;              /* faults counter */
  integer_t pageins;             /* pageins counter */
  integer_t cow_faults;          /* copy on write fault counter */
  integer_t messages_sent;       /* messages sent counter */
  integer_t messages_received;   /* messages received counter */
  integer_t syscalls_mach;       /* mach system call counter */
  integer_t syscalls_unix;       /* unix system call counter */
  uint32_t  c_switch;               /* total context switches */
  uint32_t  p_switch;               /* total processor switches */
  uint32_t  ps_switch;           /* total pset switches */
  //#ifdef  MACH_BSD
  uint32_t  pad1;
  uint32_t  pad2;
  
  void *bsd_info;
  //#endif
  struct vm_shared_region        *shared_region;
  uint32_t taskFeatures[2];        /* Special feature for this task */
#define tf64BitAddr    0x80000000        /* Task has 64-bit addressing */
#define tf64BitData    0x40000000        /* Task has 64-bit data registers */
#define task_has_64BitAddr(task)    \
        (((task)->taskFeatures[0] & tf64BitAddr) != 0)
#define task_set_64BitAddr(task)    \
        ((task)->taskFeatures[0] |= tf64BitAddr)
#define task_clear_64BitAddr(task)    \
        ((task)->taskFeatures[0] &= ~tf64BitAddr)
  
  mach_vm_address_t    all_image_info_addr; /* dyld __all_image_info     */
  mach_vm_size_t        all_image_info_size; /* section location and size */
#if CONFIG_MACF_MACH
  ipc_labelh_t label;
#endif
  
  //#if CONFIG_COUNTERS
#define TASK_PMC_FLAG 0x1    /* Bit in "t_chud" signifying PMC interest */
  uint32_t t_chud;        /* CHUD flags, used for Shark */
  //#endif
};

struct task_l {
  /* Synchronization/destruction information */
  //decl_lck_mtx_data(,lock)        /* Task's lock */
  //lck_mtx_t   *lock;
  uint32_t    lock;
  uint32_t    pad_lock; // leopard/snow padding
  
  uint32_t    ref_count;    /* Number of references to me */
  boolean_t    active;        /* Task has not been terminated */
  boolean_t    halting;    /* Task is being halted */
  
  /* Miscellaneous */
  vm_map_t    map;        /* Address space description */
  
  queue_chain_t    tasks;    /* global list of tasks */
  void        *user_data;    /* Arbitrary data settable via IPC */
  
  /* Threads in this task */
  queue_head_t        threads;
  
  processor_set_t        pset_hint;
  struct affinity_space    *affinity_space;
  
  int            thread_count;
  uint32_t        active_thread_count;
  int            suspend_count;    /* Internal scheduling only */
  
  /* User-visible scheduling information */
  integer_t        user_stop_count;    /* outstanding stops */
  
  task_role_t        role;
  
  integer_t        priority;            /* base priority for threads */
  integer_t        max_priority;        /* maximum priority for threads */
  
  /* Task security and audit tokens */
  security_token_t sec_token;
  audit_token_t    audit_token;
  
  /* Statistics */
  uint64_t        total_user_time;    /* terminated threads only */
  uint64_t        total_system_time;
  
  /* Virtual timers */
  uint32_t        vtimers;
  
  /* IPC structures */
  //decl_lck_mtx_data(,itk_lock_data)
  uint32_t itk_lock_data[1];
  struct ipc_port *itk_self;    /* not a right, doesn't hold ref */
  struct ipc_port *itk_nself;    /* not a right, doesn't hold ref */
  struct ipc_port *itk_sself;    /* a send right */
  struct exception_action exc_actions[EXC_TYPES_COUNT];
  /* a send right each valid element  */
  struct ipc_port *itk_host;    /* a send right */
  struct ipc_port *itk_bootstrap;    /* a send right */
  struct ipc_port *itk_seatbelt;    /* a send right */
  struct ipc_port *itk_gssd;    /* yet another send right */
  struct ipc_port *itk_task_access; /* and another send right */ 
  struct ipc_port *itk_registered[TASK_PORT_REGISTER_MAX];
  /* all send rights */
  
  struct ipc_space *itk_space;
  
  /* Synchronizer ownership information */
  queue_head_t    semaphore_list;        /* list of owned semaphores   */
  queue_head_t    lock_set_list;        /* list of owned lock sets    */
  int        semaphores_owned;    /* number of semaphores owned */
  int         lock_sets_owned;    /* number of lock sets owned  */
  
  /* Ledgers */
  struct ipc_port    *wired_ledger_port;
  struct ipc_port *paged_ledger_port;
  unsigned int    priv_flags;            /* privilege resource flags */
#define VM_BACKING_STORE_PRIV    0x1
  
  MACHINE_TASK
  
  integer_t faults;              /* faults counter */
  integer_t pageins;             /* pageins counter */
  integer_t cow_faults;          /* copy on write fault counter */
  integer_t messages_sent;       /* messages sent counter */
  integer_t messages_received;   /* messages received counter */
  integer_t syscalls_mach;       /* mach system call counter */
  integer_t syscalls_unix;       /* unix system call counter */
  uint32_t  c_switch;               /* total context switches */
  uint32_t  p_switch;               /* total processor switches */
  uint32_t  ps_switch;           /* total pset switches */
  //#ifdef  MACH_BSD
  uint32_t  pad1;
  uint32_t  pad2;
  
  void *bsd_info;
  //#endif
  struct vm_shared_region        *shared_region;
  uint32_t taskFeatures[2];        /* Special feature for this task */
#define tf64BitAddr    0x80000000        /* Task has 64-bit addressing */
#define tf64BitData    0x40000000        /* Task has 64-bit data registers */
#define task_has_64BitAddr(task)    \
        (((task)->taskFeatures[0] & tf64BitAddr) != 0)
#define task_set_64BitAddr(task)    \
        ((task)->taskFeatures[0] |= tf64BitAddr)
#define task_clear_64BitAddr(task)    \
        ((task)->taskFeatures[0] &= ~tf64BitAddr)
  
  mach_vm_address_t    all_image_info_addr; /* dyld __all_image_info     */
  mach_vm_size_t        all_image_info_size; /* section location and size */
#if CONFIG_MACF_MACH
  ipc_labelh_t label;
#endif
  
  //#if CONFIG_COUNTERS
#define TASK_PMC_FLAG 0x1    /* Bit in "t_chud" signifying PMC interest */
  uint32_t t_chud;        /* CHUD flags, used for Shark */
  //#endif
};

//typedef struct task_sl *task_sl_t;
typedef struct task_l  *task_l_t;