// Constructor internal Timer8254LegacyPC(PnpConfig config, Pic pic) { #if VERBOSE Tracing.Log(Tracing.Debug, "Timer8254: create"); #endif // /pnp/08/02/01/PNP0100 0003 cfg dis : ISA 8254 Timer : AT Timer // IRQ mask=0001 type=47 // I/O Port inf=01 min=0040 max=0040 aln=01 len=04 0040..0043 this.config = config; this.pic = pic; this.irq = ((IoIrqRange)config.DynamicRanges[1]).Irq; IoPortRange ioPorts = (IoPortRange)config.DynamicRanges[0]; C0Port = ioPorts.PortAtOffset(i8254_C0, 1, Access.ReadWrite); C2Port = ioPorts.PortAtOffset(i8254_C2, 1, Access.ReadWrite); CWPort = ioPorts.PortAtOffset(i8254_CW, 1, Access.ReadWrite); // Enable Timer2 // Lower 2 bits of port 61 are described in: // The Indispensable PC Hardware Book (3rd Edition) p.724 ioPorts = (IoPortRange)config.FixedRanges[0]; IoPort p = ioPorts.PortAtOffset(0, 1, Access.ReadWrite); // // Also clear the NMI RAM parity error to enable the PCI card // to generate NMI if the button is depressed // p.Write8((byte)((p.Read8() & 0xf8) | 0x01)); }
uint capabilities; // bits 0-31 at offset 0 internal Hpet(PnpConfig config) { int cpuId; Microsoft.Singularity.Hal.Platform p = Microsoft.Singularity.Hal.Platform.ThePlatform; cpuId = p.ApicId; this.config = config; IoMemoryRange imr = (IoMemoryRange)config.DynamicRanges[0]; this.region = imr.MemoryAtOffset(0, (int)imr.Length.ToUInt32(), Access.ReadWrite); capabilities = region.Read32(0x00); periodFs = region.Read32(0x04); if (cpuId == 0) { DebugStub.Print("new Hpet writing regions\n"); // Disable interrupts on timers for (uint i = 0; i <= MaxCounterIndex; i++) { DisableInterrupt(i); } uint gc = region.Read32(0x10) & ~3u; // Clear legacy bits region.Write32(0x10, gc | 1); // Enable main counter } }
// Constructor internal RTClockApic(PnpConfig config, Apic apic) { int cpuId; Microsoft.Singularity.Hal.Platform p = Microsoft.Singularity.Hal.Platform.ThePlatform; cpuId = p.ApicId; DebugStub.Print("RTClock: create\n"); // /pnp/08/03/01/PNP0B00 0003 cfg dis : ISA RTC Controller : AT RTC // IRQ mask=0100 type=47 // I/O Port inf=01 min=0070 max=0070 aln=01 len=02 0070..0071 this.config = config; this.irq = ((IoIrqRange)config.DynamicRanges[1]).Irq; this.apic = apic; this.rtcSpinLock = new SpinLock(SpinLock.Types.RTClock); rtcadd = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(0, 1, Access.ReadWrite); rtcdat = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(1, 1, Access.ReadWrite); if (cpuId == 0) { this.interrupt = Initialize(); DebugStub.Print("RTClock: interrupt {0:x2}\n", __arglist(this.interrupt)); } }
// Constructor internal Timer8254Apic(PnpConfig config) { // /pnp/08/02/01/PNP0100 0003 cfg dis : ISA 8254 Timer : AT Timer // IRQ mask=0001 type=47 // I/O Port inf=01 min=0040 max=0040 aln=01 len=04 0040..0043 this.config = config; this.irq = ((IoIrqRange)config.DynamicRanges[1]).Irq; IoPortRange ioPorts = (IoPortRange)config.DynamicRanges[0]; C2Port = ioPorts.PortAtOffset(i8254_C2, 1, Access.ReadWrite); CWPort = ioPorts.PortAtOffset(i8254_CW, 1, Access.ReadWrite); // Use Timer2 as it's not connected as interrupt source. // // Lower 2 bits of port 61 are described in: // The Indispensable PC Hardware Book (3rd Edition) p.724 ioPorts = (IoPortRange)config.FixedRanges[0]; IoPort p = ioPorts.PortAtOffset(0, 1, Access.ReadWrite); // // Also clear the NMI RAM parity error to enable the PCI card // to generate NMI if the button is depressed // p.Write8((byte)((p.Read8() & 0xf8) | 0x01)); }
private uint irqMask2; // copy of interrupt mask internal Pic(PnpConfig config) { PicResources pr = new PicResources(config); IoMemoryRange range = pr.registers; IoMemory regs = range.MemoryAtOffset(0, PicRegisterSize, Access.ReadWrite); intcps_revision = regs.MappedPortAtOffset(INTCPS_REVISION, 4, Access.Read); intcps_sysconfig = regs.MappedPortAtOffset(INTCPS_SYSCONFIG, 4, Access.ReadWrite); intcps_sysstatus = regs.MappedPortAtOffset(INTCPS_SYSSTATUS, 4, Access.Read); intcps_sir_irq = regs.MappedPortAtOffset(INTCPS_SIR_IRQ, 4, Access.Read); intcps_sir_fiq = regs.MappedPortAtOffset(INTCPS_SIR_FIQ, 4, Access.Read); intcps_control = regs.MappedPortAtOffset(INTCPS_CONTROL, 4, Access.ReadWrite); intcps_protection = regs.MappedPortAtOffset(INTCPS_PROTECTION, 4, Access.ReadWrite); intcps_idle = regs.MappedPortAtOffset(INTCPS_IDLE, 4, Access.ReadWrite); intcps_irq_priority = regs.MappedPortAtOffset(INTCPS_IRQ_PRIORITY, 4, Access.ReadWrite); intcps_fiq_priority = regs.MappedPortAtOffset(INTCPS_FIQ_PRIORITY, 4, Access.ReadWrite); intcps_threshhold = regs.MappedPortAtOffset(INTCPS_THRESHHOLD, 4, Access.ReadWrite); intcps_itr = CreatePortVector(regs, INTCPS_ITR, Access.Read); intcps_mir = CreatePortVector(regs, INTCPS_MIR, Access.ReadWrite); intcps_mir_clear = CreatePortVector(regs, INTCPS_MIR_CLEAR, Access.Write); intcps_mir_set = CreatePortVector(regs, INTCPS_MIR_SET, Access.Write); intcps_isr_set = CreatePortVector(regs, INTCPS_ISR_SET, Access.ReadWrite); intcps_isr_clear = CreatePortVector(regs, INTCPS_ISR_CLEAR, Access.Write); intcps_pending_irq = CreatePortVector(regs, INTCPS_PENDING_IRQ, Access.Read); intcps_pending_fiq = CreatePortVector(regs, INTCPS_PENDING_FIQ, Access.Read); intcps_ilr = regs.MappedPortAtOffset( INTCPS_ILR_Base, INTCPS_ILR_Offset * INTCPS_Vectors, Access.ReadWrite ); }
// Constructor internal RTClockLegacyPC(PnpConfig config, Pic pic, Timer8254LegacyPC timer) { DebugStub.Print("RTClock: create\n"); // /pnp/08/03/01/PNP0B00 0003 cfg dis : ISA RTC Controller : AT RTC // IRQ mask=0100 type=47 // I/O Port inf=01 min=0070 max=0070 aln=01 len=02 0070..0071 this.config = config; this.pic = pic; this.irq = ((IoIrqRange)config.DynamicRanges[1]).Irq; this.timer = timer; rtcadd = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(0, 1, Access.ReadWrite); rtcdat = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(1, 1, Access.ReadWrite); }
public override void Initialize(Processor rootProcessor) { DebugStub.Print("HalDevices.Initialize() - ARM\n"); // PIC PnpConfig picConfig = (PnpConfig)IoSystem.YieldResources("/arm/ti/3430/INTCPS", typeof(Pic)); pic = new Pic(picConfig); pic.Initialize(); // Timer PnpConfig timerConfig = (PnpConfig)IoSystem.YieldResources("/arm/ti/3430/GPTIMER1", typeof(TimerOmap3430)); timer = new TimerOmap3430(timerConfig, pic); byte timerInterrupt = timer.Initialize(); // Real-time clock clock = new HalClockNull(); byte clockInterrupt = clock.Initialize(); bool noisyTimer = false; CalibrateTimers.Run(clock, timer); SystemClock.Initialize(clock, TimeSpan.FromHours(8).Ticks); rootProcessor.AddPic(pic); rootProcessor.AddTimer(timerInterrupt, timer); rootProcessor.AddClock(clockInterrupt, clock); // ---------------------------------------------------------- // Add Srat tables to the Processor halMemory = new HalMemoryNull(); ProcessorNode.AddMemory(halMemory); timer.Start(); halScreen = new HalScreenNull(); Console.Screen = (HalScreen)halScreen; }
internal Pic(PnpConfig config) { // /pnp/08/00/01/PNP0000 0003 cfg dis // I/O Port inf=01 min=0020 max=0020 aln=01 len=02 0020..0021 // I/O Port inf=01 min=00a0 max=00a0 aln=01 len=02 00a0..00a1 // IRQ mask=0004 type=79 // Range[0]: 0x20; // PIC0 // Range[1]: 0xA0; // PIC1 pic0CtrlPort = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(0, 1, Access.ReadWrite); pic0MaskPort = ((IoPortRange)config.DynamicRanges[0]) .PortAtOffset(1, 1, Access.ReadWrite); pic1CtrlPort = ((IoPortRange)config.DynamicRanges[1]) .PortAtOffset(0, 1, Access.ReadWrite); pic1MaskPort = ((IoPortRange)config.DynamicRanges[1]) .PortAtOffset(1, 1, Access.ReadWrite); }
internal static IDevice CreateDevice(IoConfig config, string name) { PnpConfig pnpConfig = config as PnpConfig; if (pnpConfig == null) { return(null); } IoMemoryRange imr = config.DynamicRanges[0] as IoMemoryRange; if (imr == null) { return(null); } int imrBytes = (int)imr.Length.ToUInt32(); if (imrBytes < Hpet.MinRegionBytes) { DebugStub.Write( "HPET failed as region too small ({0} bytes).\n", __arglist(imrBytes)); return(null); } Hpet hpet = new Hpet(pnpConfig); if (hpet.MainCounterWorks()) { HalDevicesApic.SwitchToHpetClock(hpet); } else { DebugStub.Print("WARNING: HPET main counter does not work!\n"); } return(hpet); }
// Constructor internal TimerOmap3430(PnpConfig config, Pic pic) { #if VERBOSE DebugStub.WriteLine("TimerOmap3430: create"); #endif TimerResources tr = new TimerResources(config); this.config = config; this.pic = pic; this.irq = tr.irq.Irq; IoMemory timerRegisters = tr.registers .MemoryAtOffset(0, Omap3430_TIMER1_RegisterSize, Access.ReadWrite); tisr = timerRegisters.MappedPortAtOffset(Omap3430_TISR, 4, Access.ReadWrite); tier = timerRegisters.MappedPortAtOffset(Omap3430_TIER, 4, Access.ReadWrite); tclr = timerRegisters.MappedPortAtOffset(Omap3430_TCLR, 4, Access.ReadWrite); tcrr = timerRegisters.MappedPortAtOffset(Omap3430_TCRR, 4, Access.ReadWrite); tldr = timerRegisters.MappedPortAtOffset(Omap3430_TLDR, 4, Access.ReadWrite); // _ARM_ERRATA problem with how functional clock is unstuck tcrr.Write32(0, 0); }
private void InitializeBsp(Processor rootProcessor) { DebugStub.Print("HalDevicesApic.Initialize()\n"); pmTimer = AcpiTables.GetPMTimer(); // Get PIC resources. Pic is masked by default. PnpConfig picConfig = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0000", typeof(PicStub)); pic = new PicStub(picConfig); pic.Initialize(PicBaseVector); // Parse MP Table and create IO apics MpResources.ParseMpTables(); ioApics = IoApic.CreateIOApics(); halPic = new Apic(ioApics); halPic.Initialize(ApicBaseVector); // Apic timer is used to provide one-shot timer interrupts. halTimer = new ApicTimer(halPic); halTimer.Initialize(); // Calibrate timers Calibrate.CpuCycleCounter(pmTimer); Calibrate.ApicTimer(pmTimer, halTimer); // Legacy timer is used to time stalls when starting CPUs. PnpConfig i8254Config = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0100", typeof(Timer8254Apic)); stallTimer = new Timer8254Apic(i8254Config); // Real-time clock PnpConfig rtClockConfig = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0B00", typeof(RTClockApic)); rtClock = new RTClockApic(rtClockConfig, halPic); // Compose our HalClock from the component clocks we have available halClock = new HalClockApic(halPic, rtClock, new PMClock(pmTimer)); SystemClock.Initialize(halClock, TimeSpan.FromHours(8).Ticks); rootProcessor.AddPic(halPic); rootProcessor.AddTimer(halTimer.Interrupt, halTimer); rootProcessor.AddClock(halClock.Interrupt, halClock); InitializeProcessorCount(); DebugReportProcessors(); halTimer.Start(); // Get the screen resources. Since we have metadata above to // declare all fixed resources used by the screen, // YieldResources("") will keep the resource tracking correct: halScreen = new HalScreenDirect(IoSystem.YieldResources("", typeof(HalScreen))); Console.Screen = (HalScreen)halScreen; halPic.DumpState(); foreach (IoApic ioApic in ioApics) { ioApic.DumpRedirectionEntries(); } pic.DumpRegisters(); }
public override void Initialize(Processor rootProcessor) { DebugStub.Print("HalDevices.Initialize() - Legacy\n"); pmTimer = AcpiTables.GetPMTimer(); // PIC PnpConfig picConfig = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0000", typeof(Pic)); pic = new Pic(picConfig); pic.Initialize(); // Timer PnpConfig timerConfig = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0100", typeof(Timer8254LegacyPC)); timer = new Timer8254LegacyPC(timerConfig, pic); byte timerInterrupt = timer.Initialize(); // Real-time clock PnpConfig clockConfig = (PnpConfig)IoSystem.YieldResources("/pnp/PNP0B00", typeof(RTClockLegacyPC)); clock = new RTClockLegacyPC(clockConfig, pic, timer); byte clockInterrupt = clock.Initialize(); bool noisyTimer = false; if (pmTimer != null) { noisyTimer = CalibrateTimers.Run(pmTimer, timer); } else { CalibrateTimers.Run(clock, timer); } clock.SetNoisyTimer(noisyTimer); clock.Start(); SystemClock.Initialize(clock, TimeSpan.FromHours(8).Ticks); rootProcessor.AddPic(pic); rootProcessor.AddTimer(timerInterrupt, timer); rootProcessor.AddClock(clockInterrupt, clock); // ---------------------------------------------------------- // Add Srat tables to the Processor halMemory = new HalMemorySrat(AcpiTables.GetSrat()); Processor.AddMemory(halMemory); timer.Start(); // Get the screen resources. Since we have metadata above to // declare all fixed resources used by the screen, // YieldResources("") will keep the resource tracking correct: halScreen = new HalScreenDirect(IoSystem.YieldResources("", typeof(HalScreen))); Console.Screen = (HalScreen)halScreen; }