]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/bank/bank_internal.h
xnu-4903.221.2.tar.gz
[apple/xnu.git] / osfmk / bank / bank_internal.h
index 2f0d9353c7bf8c9bf700ec0d2edf58855fac4ff6..e3b3480e243d12c6e4b83000a310728eb723c2b0 100644 (file)
@@ -35,6 +35,7 @@
 #ifdef MACH_KERNEL_PRIVATE
 
 #include <kern/thread.h>
+#include <kern/thread_group.h>
 #include <kern/locks.h>
 #include <kern/queue.h>
 #include <ipc/ipc_voucher.h>
@@ -50,9 +51,10 @@ typedef mach_voucher_attr_value_handle_t bank_handle_t;
 #define BANK_ACCOUNT     1
 
 struct bank_element {
-       int           be_type;                   /* Type of element */
+       unsigned int  be_type:31,                /* Type of element */
+                     be_voucher_ref:1;          /* Voucher system holds a ref */
        int           be_refs;                   /* Ref count */
-       int           be_made;                   /* Made refs for voucher, Actual ref is also taken for each Made ref */
+       unsigned int  be_made;                   /* Made refs for voucher, Actual ref is only taken for voucher ref transition (0 to 1) */
 #if DEVELOPMENT || DEBUG
        task_t        be_task;                   /* Customer task, do not use it since ref is not taken on task */
 #endif
@@ -64,7 +66,7 @@ typedef struct bank_element * bank_element_t;
 struct bank_task {
        struct bank_element       bt_elem;                 /* Bank element */
        struct proc_persona_info  bt_proc_persona;         /* Persona of the process */
-       ledger_t                  bt_creditcard;           /* Ledger of the customer task */
+       ledger_t                  bt_ledger;               /* Ledger of the customer task */
        queue_head_t              bt_accounts_to_pay;      /* List of accounts worked for me and need to pay */
        queue_head_t              bt_accounts_to_charge;   /* List of accounts I did work and need to charge */
        decl_lck_mtx_data(,       bt_acc_to_pay_lock)      /* Lock to protect accounts to pay list */
@@ -76,6 +78,7 @@ struct bank_task {
 };
 
 #define bt_type             bt_elem.be_type
+#define bt_voucher_ref      bt_elem.be_voucher_ref
 #define bt_refs             bt_elem.be_refs
 #define bt_made             bt_elem.be_made
 
@@ -105,13 +108,13 @@ typedef struct bank_task * bank_task_t;
                (OSAddAtomic(-(num), &(elem)->bt_refs))
 
 #define bank_task_made_reference(elem)         \
-               (OSAddAtomic(1, &(elem)->bt_made))
+               (hw_atomic_add(&(elem)->bt_made, 1) - 1)
 
 #define bank_task_made_release(elem)   \
-               (OSAddAtomic(-1, &(elem)->bt_made))
+               (hw_atomic_sub(&(elem)->bt_made, 1) + 1)
 
 #define bank_task_made_release_num(elem, num)  \
-               (OSAddAtomic(-(num), &(elem)->bt_made))
+               (hw_atomic_sub(&(elem)->bt_made, (num)) + (num))
 
 
 struct bank_account {
@@ -129,6 +132,7 @@ struct bank_account {
 };
 
 #define ba_type             ba_elem.be_type
+#define ba_voucher_ref      ba_elem.be_voucher_ref
 #define ba_refs             ba_elem.be_refs
 #define ba_made             ba_elem.be_made
 
@@ -149,16 +153,17 @@ typedef struct bank_account * bank_account_t;
                (OSAddAtomic(-(num), &(elem)->ba_refs))
 
 #define bank_account_made_reference(elem)      \
-               (OSAddAtomic(1, &(elem)->ba_made))
+               (hw_atomic_add(&(elem)->ba_made, 1) - 1)
 
 #define bank_account_made_release(elem)        \
-               (OSAddAtomic(-1, &(elem)->ba_made))
+               (hw_atomic_sub(&(elem)->ba_made, 1) + 1)
 
 #define bank_account_made_release_num(elem, num)       \
-               (OSAddAtomic(-(num), &(elem)->ba_made))
+               (hw_atomic_sub(&(elem)->ba_made, (num)) + (num))
 
 struct _bank_ledger_indices {
        int cpu_time;
+       int energy;
 };
 
 extern struct _bank_ledger_indices bank_ledgers;
@@ -166,11 +171,12 @@ extern struct _bank_ledger_indices bank_ledgers;
 extern void bank_init(void);
 extern void bank_task_destroy(task_t);
 extern void bank_task_initialize(task_t task);
-extern uint64_t bank_billed_time_safe(task_t task);
-extern uint64_t bank_billed_time(bank_task_t bank_task);
-extern uint64_t bank_serviced_time_safe(task_t task);
-extern uint64_t bank_serviced_time(bank_task_t bank_task);
-extern ledger_t bank_get_voucher_ledger(ipc_voucher_t voucher);
+extern void bank_billed_balance_safe(task_t task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_billed_balance(bank_task_t bank_task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_serviced_balance_safe(task_t task, uint64_t *cpu_time, uint64_t *energy);
+extern void bank_serviced_balance(bank_task_t bank_task, uint64_t *cpu_time, uint64_t *energy);
+extern kern_return_t bank_get_bank_ledger_and_thread_group(ipc_voucher_t voucher,
+       ledger_t *bankledger, struct thread_group **banktg);
 extern void bank_swap_thread_bank_ledger(thread_t thread, ledger_t ledger);
 
 #endif /* MACH_KERNEL_PRIVATE */