X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/5d5c5d0d5b79ade9a973d55186ffda2638ba2b6e..e2fac8b15b12a7979f72090454d850e612fc5b13:/osfmk/i386/Diagnostics.c?ds=sidebyside diff --git a/osfmk/i386/Diagnostics.c b/osfmk/i386/Diagnostics.c index 0e212c2a6..74f806a63 100644 --- a/osfmk/i386/Diagnostics.c +++ b/osfmk/i386/Diagnostics.c @@ -1,31 +1,29 @@ /* - * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2005-2008 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_OSREFERENCE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the - * License may not be used to create, or enable the creation or - * redistribution of, unlawful or unlicensed copies of an Apple operating - * system, or to circumvent, violate, or enable the circumvention or - * violation of, any terms of an Apple operating system software license - * agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and * limitations under the License. - * - * @APPLE_LICENSE_OSREFERENCE_HEADER_END@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_FREE_COPYRIGHT@ @@ -71,7 +69,6 @@ #include #include #include -#include #include extern uint64_t lastNapClear; @@ -80,24 +77,76 @@ diagWork dgWork; uint64_t lastNapClear = 0ULL; uint64_t lastRuptClear = 0ULL; -typedef struct pmdata { - uint64_t pmNapDur; /* Time since last query */ - pmStats_t pmd; /* Powermanagement statistics */ -} pmdata; - - int -diagCall64(__unused x86_saved_state_t * regs) +diagCall64(x86_saved_state_t * state) { - panic("diagCall not yet supported for 64 bit tasks\n"); + uint64_t curpos, i, j; + uint64_t selector, data; + uint64_t currNap, durNap; + x86_saved_state64_t *regs; + + assert(is_saved_state64(state)); + regs = saved_state64(state); + + if (!(dgWork.dgFlags & enaDiagSCs)) + return 0; /* If not enabled, cause an exception */ + + selector = regs->rdi; + + switch (selector) { /* Select the routine */ + case dgRuptStat: /* Suck Interruption statistics */ + data = regs->rsi; /* Get the number of processors */ + + if (data == 0) { /* If no location is specified for data, clear all + * counts + */ + for (i = 0; i < real_ncpus; i++) { /* Cycle through + * processors */ + for (j = 0; j < 256; j++) + cpu_data_ptr[i]->cpu_hwIntCnt[j] = 0; + } + + lastRuptClear = mach_absolute_time(); /* Get the time of clear */ + return 1; /* Normal return */ + } + + (void) copyout((char *) &real_ncpus, data, sizeof(real_ncpus)); /* Copy out number of + * processors */ + + currNap = mach_absolute_time(); /* Get the time now */ + durNap = currNap - lastRuptClear; /* Get the last interval + * duration */ + if (durNap == 0) + durNap = 1; /* This is a very short time, make it + * bigger */ + + curpos = data + sizeof(real_ncpus); /* Point to the next + * available spot */ + + for (i = 0; i < real_ncpus; i++) { /* Move 'em all out */ + (void) copyout((char *) &durNap, curpos, 8); /* Copy out the time + * since last clear */ + (void) copyout((char *) &cpu_data_ptr[i]->cpu_hwIntCnt, curpos + 8, 256 * sizeof(uint32_t)); /* Copy out interrupt + * data for this + * processor */ + curpos = curpos + (256 * sizeof(uint32_t) + 8); /* Point to next out put + * slot */ + } + break; + + default: /* Handle invalid ones */ + return 0; /* Return an exception */ + + } + + return 1; /* Normal non-ast check return */ } int diagCall(x86_saved_state_t * state) { - uint32_t stk, curpos, i, j; uint32_t selector, data; int err; @@ -116,7 +165,6 @@ diagCall(x86_saved_state_t * state) return 0; /* Failed to fetch stack */ } switch (selector) { /* Select the routine */ - case dgRuptStat: /* Suck Interruption statistics */ err = copyin((user_addr_t) (stk + 8), (char *) &data, sizeof(uint32_t)); /* Get the selector */ @@ -132,7 +180,6 @@ diagCall(x86_saved_state_t * state) lastRuptClear = mach_absolute_time(); /* Get the time of clear */ return 1; /* Normal return */ } - err = copyin((user_addr_t) (stk + 8), (char *) &data, sizeof(uint32_t)); /* Get the selector */ (void) copyout((char *) &real_ncpus, data, sizeof(real_ncpus)); /* Copy out number of * processors */