]>
Commit | Line | Data |
---|---|---|
1c79356b | 1 | /* |
316670eb | 2 | * Copyright (c) 2010 Apple Computer, Inc. All rights reserved. |
1c79356b | 3 | * |
2d21ac55 | 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
1c79356b | 5 | * |
2d21ac55 A |
6 | * This file contains Original Code and/or Modifications of Original Code |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. The rights granted to you under the License | |
10 | * may not be used to create, or enable the creation or redistribution of, | |
11 | * unlawful or unlicensed copies of an Apple operating system, or to | |
12 | * circumvent, violate, or enable the circumvention or violation of, any | |
13 | * terms of an Apple operating system software license agreement. | |
8f6c56a5 | 14 | * |
2d21ac55 A |
15 | * Please obtain a copy of the License at |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. | |
17 | * | |
18 | * The Original Code and all software distributed under the License are | |
19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
8f6c56a5 A |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
2d21ac55 A |
22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
23 | * Please see the License for the specific language governing rights and | |
24 | * limitations under the License. | |
8f6c56a5 | 25 | * |
2d21ac55 | 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
1c79356b A |
27 | */ |
28 | /* | |
29 | * @OSF_COPYRIGHT@ | |
30 | */ | |
91447636 | 31 | |
1c79356b A |
32 | #ifndef _KERN_LEDGER_H_ |
33 | #define _KERN_LEDGER_H_ | |
34 | ||
316670eb A |
35 | #define LEDGER_INFO 0 |
36 | #define LEDGER_ENTRY_INFO 1 | |
37 | #define LEDGER_TEMPLATE_INFO 2 | |
38 | #define LEDGER_LIMIT 3 | |
ecc0ceb4 A |
39 | /* LEDGER_MAX_CMD always tracks the index of the last ledger command. */ |
40 | #define LEDGER_MAX_CMD LEDGER_LIMIT | |
9bccf70c | 41 | |
316670eb | 42 | #define LEDGER_NAME_MAX 32 |
1c79356b | 43 | |
316670eb A |
44 | struct ledger_info { |
45 | char li_name[LEDGER_NAME_MAX]; | |
46 | int64_t li_id; | |
47 | int64_t li_entries; | |
1c79356b A |
48 | }; |
49 | ||
316670eb A |
50 | struct ledger_template_info { |
51 | char lti_name[LEDGER_NAME_MAX]; | |
52 | char lti_group[LEDGER_NAME_MAX]; | |
53 | char lti_units[LEDGER_NAME_MAX]; | |
54 | }; | |
1c79356b | 55 | |
316670eb A |
56 | struct ledger_entry_info { |
57 | int64_t lei_balance; | |
58 | int64_t lei_credit; | |
59 | int64_t lei_debit; | |
60 | uint64_t lei_limit; | |
61 | uint64_t lei_refill_period; /* In milliseconds */ | |
62 | uint64_t lei_last_refill; /* Time since last refill */ | |
63 | }; | |
9bccf70c | 64 | |
316670eb A |
65 | struct ledger_limit_args { |
66 | char lla_name[LEDGER_NAME_MAX]; | |
67 | uint64_t lla_limit; | |
68 | uint64_t lla_refill_period; | |
69 | }; | |
9bccf70c | 70 | |
316670eb A |
71 | #ifdef KERNEL_PRIVATE |
72 | ||
73 | typedef struct ledger_template *ledger_template_t; | |
74 | ||
75 | #define LEDGER_VALID(ledger) (ledger != LEDGER_NULL) | |
76 | ||
77 | /* Action to take when a ledger goes into deficit */ | |
78 | #define LEDGER_ACTION_IGNORE 0x0000 | |
79 | #define LEDGER_ACTION_BLOCK 0x0010 | |
39236c6e | 80 | #define LEDGER_ACTION_CALLBACK 0x0020 |
316670eb A |
81 | #define LEDGER_ACTION_MASK 0x00f0 |
82 | ||
39236c6e A |
83 | /* |
84 | * Types of warnings that trigger a callback. | |
85 | */ | |
86 | #define LEDGER_WARNING_ROSE_ABOVE 1 | |
87 | #define LEDGER_WARNING_DIPPED_BELOW 2 | |
88 | ||
89 | typedef void (*ledger_callback_t)(int warning, const void * param0, const void *param1); | |
316670eb A |
90 | |
91 | extern void ledger_init(void); | |
92 | ||
93 | extern ledger_template_t ledger_template_create(const char *name); | |
94 | extern void ledger_template_dereference(ledger_template_t template); | |
95 | extern int ledger_entry_add(ledger_template_t template, const char *key, | |
96 | const char *group, const char *units); | |
97 | extern kern_return_t ledger_set_callback(ledger_template_t template, int entry, | |
98 | ledger_callback_t callback, const void *param0, const void *param1); | |
39236c6e A |
99 | extern kern_return_t ledger_track_maximum(ledger_template_t template, int entry, |
100 | int period_in_secs); | |
fe8ab488 A |
101 | extern kern_return_t ledger_panic_on_negative(ledger_template_t template, |
102 | int entry); | |
316670eb A |
103 | extern int ledger_key_lookup(ledger_template_t template, const char *key); |
104 | ||
105 | /* value of entry type */ | |
106 | #define LEDGER_CREATE_ACTIVE_ENTRIES 0 | |
107 | #define LEDGER_CREATE_INACTIVE_ENTRIES 1 | |
108 | extern ledger_t ledger_instantiate(ledger_template_t template, int entry_type); | |
109 | extern kern_return_t ledger_disable_callback(ledger_t ledger, int entry); | |
39236c6e A |
110 | extern kern_return_t ledger_enable_callback(ledger_t ledger, int entry); |
111 | extern kern_return_t ledger_get_limit(ledger_t ledger, int entry, | |
112 | ledger_amount_t *limit); | |
316670eb | 113 | extern kern_return_t ledger_set_limit(ledger_t ledger, int entry, |
39236c6e A |
114 | ledger_amount_t limit, uint8_t warn_level_percentage); |
115 | extern kern_return_t ledger_get_maximum(ledger_t ledger, int entry, | |
116 | ledger_amount_t *max_observed_balance); | |
117 | extern kern_return_t ledger_get_actions(ledger_t ledger, int entry, int *actions); | |
316670eb | 118 | extern kern_return_t ledger_set_action(ledger_t ledger, int entry, int action); |
39236c6e A |
119 | extern kern_return_t ledger_get_period(ledger_t ledger, int entry, |
120 | uint64_t *period); | |
316670eb A |
121 | extern kern_return_t ledger_set_period(ledger_t ledger, int entry, |
122 | uint64_t period); | |
39236c6e | 123 | extern kern_return_t ledger_disable_refill(ledger_t l, int entry); |
316670eb | 124 | extern kern_return_t ledger_entry_setactive(ledger_t ledger, int entry); |
3e170ce0 | 125 | extern void ledger_check_new_balance(ledger_t ledger, int entry); |
316670eb A |
126 | extern kern_return_t ledger_credit(ledger_t ledger, int entry, |
127 | ledger_amount_t amount); | |
128 | extern kern_return_t ledger_debit(ledger_t ledger, int entry, | |
129 | ledger_amount_t amount); | |
39236c6e | 130 | extern kern_return_t ledger_zero_balance(ledger_t ledger, int entry); |
316670eb A |
131 | extern kern_return_t ledger_get_entries(ledger_t ledger, int entry, |
132 | ledger_amount_t *credit, ledger_amount_t *debit); | |
39236c6e A |
133 | extern kern_return_t ledger_get_balance(ledger_t ledger, int entry, |
134 | ledger_amount_t *balance); | |
fe8ab488 A |
135 | extern kern_return_t ledger_reset_callback_state(ledger_t ledger, int entry); |
136 | extern kern_return_t ledger_disable_panic_on_negative(ledger_t ledger, int entry); | |
137 | ||
138 | extern kern_return_t ledger_rollup(ledger_t to_ledger, ledger_t from_ledger); | |
316670eb A |
139 | |
140 | extern void ledger_ast(thread_t thread); | |
316670eb A |
141 | |
142 | extern int ledger_reference_count(ledger_t ledger); | |
143 | extern kern_return_t ledger_reference(ledger_t ledger); | |
144 | extern kern_return_t ledger_dereference(ledger_t ledger); | |
145 | ||
146 | /* Per-pmap ledger operations */ | |
147 | #define pmap_ledger_debit(p, e, a) ledger_debit((p)->ledger, e, a) | |
148 | #define pmap_ledger_credit(p, e, a) ledger_credit((p)->ledger, e, a) | |
149 | ||
150 | /* Support for ledger() syscall */ | |
151 | #ifdef LEDGER_DEBUG | |
152 | extern int ledger_limit(task_t task, struct ledger_limit_args *args); | |
153 | #endif | |
154 | extern int ledger_info(task_t task, struct ledger_info *info); | |
39236c6e A |
155 | |
156 | extern int | |
157 | ledger_get_task_entry_info_multiple(task_t task, void **buf, int *len); | |
158 | ||
159 | extern void | |
160 | ledger_get_entry_info(ledger_t ledger, int entry, | |
161 | struct ledger_entry_info *lei); | |
162 | ||
316670eb A |
163 | extern int ledger_template_info(void **buf, int *len); |
164 | ||
165 | #endif /* KERNEL_PRIVATE */ | |
1c79356b A |
166 | |
167 | #endif /* _KERN_LEDGER_H_ */ |