1/* 2* Copyright (c) 2013 Apple 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#include <kern/debug.h> 29#include <sys/param.h> 30#include <sys/mman.h> 31#include <sys/stat.h> 32#include <sys/sysctl.h> 33#include <sys/priv.h> 34#include <mach/machine.h> 35#include <libkern/libkern.h> 36#include <kern/assert.h> 37#include <pexpert/pexpert.h> 38#include <kern/ecc.h> 39 40static int 41get_ecc_data_handler(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, 42 struct sysctl_req *req) 43{ 44 struct ecc_event ev; 45 int changed, retval; 46 47 if (priv_check_cred(kauth_cred_get(), PRIV_HW_DEBUG_DATA, 0) != 0) { 48 return EPERM; 49 } 50 51 if (KERN_SUCCESS != ecc_log_get_next_event(&ev)) { 52 /* 53 * EAGAIN would be better, but sysctl infrastructure 54 * interprets that */ 55 return EBUSY; 56 } 57 58 retval = sysctl_io_opaque(req, &ev, sizeof(ev), &changed); 59 assert(!changed); 60 61 return retval; 62} 63 64SYSCTL_PROC(_kern, OID_AUTO, next_ecc_event, 65 CTLFLAG_RD | CTLFLAG_ANYBODY | CTLFLAG_MASKED | CTLTYPE_STRUCT, 66 0, 0, get_ecc_data_handler, 67 "-", ""); 68