|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1997 Apple Computer, Inc. ! 27: * ! 28: * HISTORY ! 29: * ! 30: * [email protected] ! 31: * Fixed sleep integration problem. sleep was not properly ! 32: * handling thread states of THREAD_INTERRUPTED and ! 33: * THREAD_MUST_TERMINATE, so callers of sleep were getting ! 34: * confused and many times looping. This fixes the (in)famous ! 35: * unkillable gdb problem, the PB (and other processes) don't ! 36: * terminate, and more. Cleaned up ast code to be just like ! 37: * i386 version. ! 38: * ! 39: */ ! 40: ! 41: #import <mach/mach_types.h> ! 42: #import <mach/exception.h> ! 43: ! 44: #import <sys/param.h> ! 45: #import <sys/proc.h> ! 46: #import <sys/user.h> ! 47: #include <kern/ast.h> ! 48: ! 49: ! 50: #ifdef MACHINE_AST ! 51: void ! 52: astoff(int mycpu) ! 53: { ! 54: printf("astoff: turning off needast, cpu=%x\n",mycpu); ! 55: } ! 56: ! 57: ! 58: ! 59: void ! 60: aston(int mycpu) ! 61: { ! 62: printf("aston: setting needast, cpu=%x\n",mycpu); ! 63: } ! 64: #endif ! 65: ! 66: ! 67: ! 68: void ! 69: check_for_ast(void) ! 70: { ! 71: thread_t thread; ! 72: struct proc *p; ! 73: ppc_saved_state_t *saved_state; ! 74: ! 75: ! 76: thread = current_thread(); ! 77: p = current_proc(); ! 78: saved_state = &thread->pcb->ss; ! 79: ! 80: while (TRUE) { ! 81: ast_t reasons; ! 82: int mycpu = cpu_number(); ! 83: int signum; ! 84: ! 85: reasons = ast_needed(mycpu); ! 86: ! 87: if (p) { ! 88: if ((p->p_flag & P_OWEUPC) && (p->p_flag & P_PROFIL)) { ! 89: addupc_task(p, saved_state->srr0, 1); ! 90: p->p_flag &= ~P_OWEUPC; ! 91: } ! 92: ! 93: ast_off(mycpu, AST_UNIX); ! 94: ! 95: if (CHECK_SIGNALS(p, thread, thread->_uthread)) { ! 96: signum = issignal(p); ! 97: if (signum) { ! 98: postsig(signum); ! 99: } ! 100: } ! 101: } ! 102: ! 103: ast_off(mycpu, reasons); ! 104: ! 105: if (thread_should_halt(thread)) ! 106: thread_halt_self(); ! 107: else if ((reasons & AST_BLOCK) || ! 108: csw_needed(thread, current_processor())) { ! 109: p->p_stats->p_ru.ru_nivcsw++; ! 110: thread_block_with_continuation(thread_exception_return); ! 111: } ! 112: else ! 113: break; ! 114: } ! 115: ! 116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.