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