1*4d495c6eSApple OSS Distributions #include <darwintest.h> 2*4d495c6eSApple OSS Distributions #include <darwintest_utils.h> 3*4d495c6eSApple OSS Distributions #include <sys/types.h> 4*4d495c6eSApple OSS Distributions #include <TargetConditionals.h> 5*4d495c6eSApple OSS Distributions 6*4d495c6eSApple OSS Distributions #include "../osfmk/kern/ledger.h" 7*4d495c6eSApple OSS Distributions extern int ledger(int cmd, caddr_t arg1, caddr_t arg2, caddr_t arg3); 8*4d495c6eSApple OSS Distributions 9*4d495c6eSApple OSS Distributions T_DECL(ledger_entry_v2, 10*4d495c6eSApple OSS Distributions "test the LEDGER_ENTRY_INFO_V2 command of ledger() syscal", 11*4d495c6eSApple OSS Distributions T_META_LTEPHASE(LTE_POSTINIT), 12*4d495c6eSApple OSS Distributions T_META_OWNER("skwok2"), 13*4d495c6eSApple OSS Distributions T_META_TAG_VM_PREFERRED) 14*4d495c6eSApple OSS Distributions { 15*4d495c6eSApple OSS Distributions struct ledger_info li; 16*4d495c6eSApple OSS Distributions int64_t ledger_count; 17*4d495c6eSApple OSS Distributions struct ledger_entry_info_v2 *lei_v2 = NULL; 18*4d495c6eSApple OSS Distributions bool retrieved_lifetime_max = false; 19*4d495c6eSApple OSS Distributions size_t malloc_size = 0; 20*4d495c6eSApple OSS Distributions 21*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_EQ(ledger(LEDGER_INFO, 22*4d495c6eSApple OSS Distributions (caddr_t)(uintptr_t)getpid(), 23*4d495c6eSApple OSS Distributions (caddr_t)&li, 24*4d495c6eSApple OSS Distributions NULL), 25*4d495c6eSApple OSS Distributions 0, 26*4d495c6eSApple OSS Distributions "ledger(LEDGER_INFO)"); 27*4d495c6eSApple OSS Distributions 28*4d495c6eSApple OSS Distributions ledger_count = li.li_entries; 29*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_GT(ledger_count, 0, "no ledger entry available"); 30*4d495c6eSApple OSS Distributions 31*4d495c6eSApple OSS Distributions malloc_size = (size_t)ledger_count * sizeof(struct ledger_entry_info_v2); 32*4d495c6eSApple OSS Distributions lei_v2 = (struct ledger_entry_info_v2 *)malloc(malloc_size); 33*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_NE(lei_v2, NULL, "malloc(ledger_entry_info_v2) of size %u", malloc_size); 34*4d495c6eSApple OSS Distributions 35*4d495c6eSApple OSS Distributions 36*4d495c6eSApple OSS Distributions T_ASSERT_GE(ledger(LEDGER_ENTRY_INFO_V2, 37*4d495c6eSApple OSS Distributions (caddr_t)(uintptr_t)getpid(), 38*4d495c6eSApple OSS Distributions (caddr_t)lei_v2, 39*4d495c6eSApple OSS Distributions (caddr_t)&ledger_count), 40*4d495c6eSApple OSS Distributions 0, 41*4d495c6eSApple OSS Distributions "ledger(LEDGER_ENTRY_INFO_V2)"); 42*4d495c6eSApple OSS Distributions 43*4d495c6eSApple OSS Distributions for (int i = 0; i < ledger_count; i++) { 44*4d495c6eSApple OSS Distributions if (lei_v2[i].lei_lifetime_max != -1) { 45*4d495c6eSApple OSS Distributions retrieved_lifetime_max = true; 46*4d495c6eSApple OSS Distributions break; 47*4d495c6eSApple OSS Distributions } 48*4d495c6eSApple OSS Distributions } 49*4d495c6eSApple OSS Distributions 50*4d495c6eSApple OSS Distributions free(lei_v2); 51*4d495c6eSApple OSS Distributions 52*4d495c6eSApple OSS Distributions if (retrieved_lifetime_max) { 53*4d495c6eSApple OSS Distributions T_PASS("successfully retrieved at least one entry which support lifetime max"); 54*4d495c6eSApple OSS Distributions } else { 55*4d495c6eSApple OSS Distributions T_FAIL("couldn't read any lifetime max value"); 56*4d495c6eSApple OSS Distributions } 57*4d495c6eSApple OSS Distributions } 58