63 lines
1.8 KiB
C#
63 lines
1.8 KiB
C#
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: ApServiceThread.cs
|
|
//
|
|
// Note:
|
|
//
|
|
|
|
using System.Threading;
|
|
|
|
using Microsoft.Singularity;
|
|
|
|
|
|
namespace Microsoft.Singularity
|
|
{
|
|
internal class ApServiceThread
|
|
{
|
|
public static AutoResetEvent abiEvent;
|
|
|
|
internal static void Initialize()
|
|
{
|
|
abiEvent = new AutoResetEvent(false);
|
|
Thread.CreateThread(Thread.CurrentProcess, new ThreadStart(ApServiceLoop)).Start();
|
|
}
|
|
|
|
private static void ApServiceLoop()
|
|
{
|
|
DebugStub.WriteLine("ApServiceThread is initialized and sleeping ...");
|
|
MpExecution.MpCall mpCall;
|
|
bool iflag;
|
|
|
|
while (true) {
|
|
abiEvent.WaitOne();
|
|
|
|
DebugStub.WriteLine
|
|
("HSG: ** cpu.{0} receives AbiCall interrupt",
|
|
__arglist(Processor.GetCurrentProcessorId()));
|
|
|
|
// Current design: the boot processor will get all
|
|
// unserved abi call. So we don't need to worry
|
|
// missing any calls
|
|
while (true) {
|
|
|
|
iflag = Processor.DisableInterrupts();
|
|
mpCall = MpExecution.GetMpCall(Processor.GetCurrentProcessorId());
|
|
Processor.RestoreInterrupts(iflag);
|
|
|
|
|
|
// There is no unserved abi call, just break
|
|
if (mpCall == null) {
|
|
break;
|
|
}
|
|
|
|
BspAbiStub.ProcessMpCall(Processor.GetCurrentProcessorId(), mpCall);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|