|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * AppleI386CPU.cpp
5: *
6: * March 6, 2000 jliu
7: * Created based on AppleCPU.
8: */
9:
10: #include "AppleI386CPU.h"
11:
12: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
13:
14: #undef super
15: #define super IOCPU
16:
17: OSDefineMetaClassAndStructors(AppleI386CPU, IOCPU);
18:
19: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
20:
21: bool AppleI386CPU::start(IOService * provider)
22: {
23: // kern_return_t result;
24:
25: if (!super::start(provider)) return false;
26:
27: cpuIC = new AppleI386CPUInterruptController;
28: if (cpuIC == 0) return false;
29:
30: if (cpuIC->initCPUInterruptController(1) != kIOReturnSuccess)
31: return false;
32:
33: cpuIC->attach(this);
34:
35: cpuIC->registerCPUInterruptController();
36:
37: #ifdef NOTYET
38: // Register this CPU with mach.
39: result = ml_processor_register((cpu_id_t)this, 0,
40: &machProcessor, &ipi_handler, true);
41: if (result == KERN_FAILURE) return false;
42: #endif
43:
44: cpuState = kIOCPUStateUninitalized;
45:
46: #ifdef NOTYET
47: processor_start(machProcessor);
48: #endif
49:
50: // Hack. Call initCPU() ourself since no one else will.
51: initCPU();
52:
53: return true;
54: }
55:
56: void AppleI386CPU::initCPU(void)
57: {
58: cpuIC->enableCPUInterrupt(this);
59:
60: cpuState = kIOCPUStateRunning;
61: }
62:
63: OSSymbol * AppleI386CPU::getCPUName(void)
64: {
65: return (OSSymbol *) OSSymbol::withCStringNoCopy("Primary0");
66: }
67:
68: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
69:
70: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
71:
72: #undef super
73: #define super IOCPUInterruptController
74:
75: OSDefineMetaClassAndStructors(AppleI386CPUInterruptController,
76: IOCPUInterruptController);
77:
78: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
79:
80: IOReturn AppleI386CPUInterruptController::handleInterrupt(void * /*refCon*/,
81: IOService * /*nub*/,
82: int source)
83: {
84: IOInterruptVector * vector;
85:
86: // Override the implementation in IOCPUInterruptController to
87: // dispatch interrupts the old way.
88: //
89: // source argument is ignored, use the first IOCPUInterruptController
90: // in the vector array.
91: //
92: vector = &vectors[0];
93:
94: if (!vector->interruptRegistered)
95: return kIOReturnInvalid;
96:
97: vector->handler(vector->target,
98: vector->refCon,
99: vector->nub,
100: source);
101:
102: return kIOReturnSuccess;
103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.