1/* 2 * Copyright (c) 2010 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 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. 14 * 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 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 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. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * @OSF_COPYRIGHT@ 30 */ 31 32#ifndef _KERN_LEDGER_H_ 33#define _KERN_LEDGER_H_ 34 35#define LEDGER_INFO 0 36#define LEDGER_ENTRY_INFO 1 37#define LEDGER_TEMPLATE_INFO 2 38#define LEDGER_LIMIT 3 39 40#define LEDGER_NAME_MAX 32 41 42struct ledger_info { 43 char li_name[LEDGER_NAME_MAX]; 44 int64_t li_id; 45 int64_t li_entries; 46}; 47 48struct ledger_template_info { 49 char lti_name[LEDGER_NAME_MAX]; 50 char lti_group[LEDGER_NAME_MAX]; 51 char lti_units[LEDGER_NAME_MAX]; 52}; 53 54struct ledger_entry_info { 55 int64_t lei_balance; 56 int64_t lei_credit; 57 int64_t lei_debit; 58 uint64_t lei_limit; 59 uint64_t lei_refill_period; /* In milliseconds */ 60 uint64_t lei_last_refill; /* Time since last refill */ 61}; 62 63struct ledger_limit_args { 64 char lla_name[LEDGER_NAME_MAX]; 65 uint64_t lla_limit; 66 uint64_t lla_refill_period; 67}; 68 69#ifdef KERNEL_PRIVATE 70 71typedef struct ledger_template *ledger_template_t; 72 73#define LEDGER_VALID(ledger) (ledger != LEDGER_NULL) 74 75/* Action to take when a ledger goes into deficit */ 76#define LEDGER_ACTION_IGNORE 0x0000 77#define LEDGER_ACTION_BLOCK 0x0010 78#define LEDGER_ACTION_EXCEPTION 0x0020 79#define LEDGER_ACTION_CALLBACK 0x0040 80#define LEDGER_ACTION_MASK 0x00f0 81 82typedef void (*ledger_callback_t)(const void * param0, const void *param1); 83 84extern void ledger_init(void); 85 86extern ledger_template_t ledger_template_create(const char *name); 87extern void ledger_template_dereference(ledger_template_t template); 88extern int ledger_entry_add(ledger_template_t template, const char *key, 89 const char *group, const char *units); 90extern kern_return_t ledger_set_callback(ledger_template_t template, int entry, 91 ledger_callback_t callback, const void *param0, const void *param1); 92extern int ledger_key_lookup(ledger_template_t template, const char *key); 93 94/* value of entry type */ 95#define LEDGER_CREATE_ACTIVE_ENTRIES 0 96#define LEDGER_CREATE_INACTIVE_ENTRIES 1 97extern ledger_t ledger_instantiate(ledger_template_t template, int entry_type); 98extern kern_return_t ledger_disable_callback(ledger_t ledger, int entry); 99extern kern_return_t ledger_reset_callback(ledger_t ledger, int entry); 100extern kern_return_t ledger_set_limit(ledger_t ledger, int entry, 101 ledger_amount_t limit); 102extern kern_return_t ledger_set_action(ledger_t ledger, int entry, int action); 103extern kern_return_t ledger_set_period(ledger_t ledger, int entry, 104 uint64_t period); 105extern kern_return_t ledger_entry_setactive(ledger_t ledger, int entry); 106extern kern_return_t ledger_credit(ledger_t ledger, int entry, 107 ledger_amount_t amount); 108extern kern_return_t ledger_debit(ledger_t ledger, int entry, 109 ledger_amount_t amount); 110extern kern_return_t ledger_get_entries(ledger_t ledger, int entry, 111 ledger_amount_t *credit, ledger_amount_t *debit); 112 113extern void ledger_ast(thread_t thread); 114extern void set_astledger(thread_t thread); 115 116extern int ledger_reference_count(ledger_t ledger); 117extern kern_return_t ledger_reference(ledger_t ledger); 118extern kern_return_t ledger_dereference(ledger_t ledger); 119 120/* Per-pmap ledger operations */ 121#define pmap_ledger_debit(p, e, a) ledger_debit((p)->ledger, e, a) 122#define pmap_ledger_credit(p, e, a) ledger_credit((p)->ledger, e, a) 123 124/* Support for ledger() syscall */ 125#ifdef LEDGER_DEBUG 126extern int ledger_limit(task_t task, struct ledger_limit_args *args); 127#endif 128extern int ledger_info(task_t task, struct ledger_info *info); 129extern int ledger_entry_info(task_t task, void **buf, int *len); 130extern int ledger_template_info(void **buf, int *len); 131 132#endif /* KERNEL_PRIVATE */ 133 134#endif /* _KERN_LEDGER_H_ */ 135