X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/21362eb3e66fd2c787aee132bce100a44d71a99c..6d2010ae8f7a6078e10b361c6962983bab233e0f:/osfmk/kern/ast.c?ds=sidebyside diff --git a/osfmk/kern/ast.c b/osfmk/kern/ast.c index 614c77365..e7b895598 100644 --- a/osfmk/kern/ast.c +++ b/osfmk/kern/ast.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2009 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -79,10 +79,12 @@ #include #include #include +#include // for CHUD AST hook +#include + + +volatile perfASTCallback perfASTHook; -#ifdef __ppc__ -#include // for CHUD AST hook -#endif void ast_init(void) @@ -101,23 +103,21 @@ ast_taken( boolean_t preempt_trap = (reasons == AST_PREEMPTION); ast_t *myast = ast_pending(); thread_t thread = current_thread(); + perfASTCallback perf_hook = perfASTHook; -#ifdef __ppc__ /* * CHUD hook - all threads including idle processor threads */ - if(perfASTHook) { - if(*myast & AST_PPC_CHUD_ALL) { - perfASTHook(0, NULL, 0, 0); + if (perf_hook) { + if (*myast & AST_CHUD_ALL) { + (*perf_hook)(reasons, myast); - if(*myast == AST_NONE) { - return; // nothing left to do - } + if (*myast == AST_NONE) + return; } - } else { - *myast &= ~AST_PPC_CHUD_ALL; } -#endif + else + *myast &= ~AST_CHUD_ALL; reasons &= *myast; *myast &= ~reasons; @@ -169,14 +169,9 @@ ast_taken( /* * Check for preemption. */ - if (reasons & AST_PREEMPT) { - processor_t myprocessor = current_processor(); + if (reasons & AST_PREEMPT) + reasons = csw_check(current_processor()); - if (csw_needed(thread, myprocessor)) - reasons = AST_PREEMPT; - else - reasons = AST_NONE; - } if ( (reasons & AST_PREEMPT) && wait_queue_assert_possible(thread) ) { counter(c_ast_taken_block++); @@ -195,22 +190,25 @@ void ast_check( processor_t processor) { - register thread_t thread = processor->active_thread; + thread_t thread = processor->active_thread; processor->current_pri = thread->sched_pri; + processor->current_thmode = thread->sched_mode; if ( processor->state == PROCESSOR_RUNNING || processor->state == PROCESSOR_SHUTDOWN ) { - register ast_t preempt; + ast_t preempt; /* * Propagate thread ast to processor. */ + pal_ast_check(thread); + ast_propagate(thread->ast); /* * Context switch check. */ - if ((preempt = csw_check(thread, processor)) != AST_NONE) + if ((preempt = csw_check(processor)) != AST_NONE) ast_on(preempt); } }