1 // 2 // Copyright (c) 2010-2022 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 8 using System; 9 using System.Collections.Generic; 10 using Antmicro.Renode.Core; 11 using Antmicro.Renode.Core.Structure.Registers; 12 using Antmicro.Renode.Logging; 13 14 namespace Antmicro.Renode.Peripherals.Miscellaneous 15 { 16 public class OpenTitan_AlertHandler: BasicDoubleWordPeripheral, IKnownSize, IGPIOReceiver 17 { OpenTitan_AlertHandler(IMachine machine)18 public OpenTitan_AlertHandler(IMachine machine) : base(machine) 19 { 20 alertCause = new IFlagRegisterField[AlertsCount]; 21 alertEnabled = new IFlagRegisterField[AlertsCount]; 22 alertClasses = new IEnumRegisterField<AlertClass>[AlertsCount]; 23 24 localAlertCause = new IFlagRegisterField[LocalAlertsCount]; 25 localAlertEnabled = new IFlagRegisterField[LocalAlertsCount]; 26 localAlertClasses = new IEnumRegisterField<AlertClass>[LocalAlertsCount]; 27 28 ClassAInterrupt = new GPIO(); 29 ClassBInterrupt = new GPIO(); 30 ClassCInterrupt = new GPIO(); 31 ClassDInterrupt = new GPIO(); 32 33 DefineRegisters(); 34 } 35 OnGPIO(int number, bool value)36 public void OnGPIO(int number, bool value) 37 { 38 if(number >= AlertsCount) 39 { 40 this.Log(LogLevel.Error, "This peripheral can only handle {0}, the alert {1} is not valid", AlertsCount, number); 41 } 42 if(value) 43 { 44 this.DebugLog("Alert {0} triggered", number); 45 alertCause[number].Value = value; 46 var alertClass = alertClasses[number].Value; 47 var enabled = alertEnabled[number].Value; 48 if(value & enabled) 49 { 50 HandleAlertOfClass(alertClass); 51 } 52 } 53 } 54 55 public GPIO ClassAInterrupt { get; } 56 public GPIO ClassBInterrupt { get; } 57 public GPIO ClassCInterrupt { get; } 58 public GPIO ClassDInterrupt { get; } 59 60 public long Size => 0x1000; 61 DefineRegisters()62 private void DefineRegisters() 63 { 64 Registers.InterruptState.Define(this) 65 .WithFlag(0, out classAInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classa") 66 .WithFlag(1, out classBInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classb") 67 .WithFlag(2, out classCInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classc") 68 .WithFlag(3, out classDInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classd") 69 .WithWriteCallback((_, val) => { if(val != 0) UpdateInterrupts(); }) 70 .WithReservedBits(4, 32 - 4); 71 72 Registers.InterruptEnable.Define(this) 73 .WithFlag(0, out classAInterruptEnable, name: "classa") 74 .WithFlag(1, out classBInterruptEnable, name: "classb") 75 .WithFlag(2, out classCInterruptEnable, name: "classc") 76 .WithFlag(3, out classDInterruptEnable, name: "classd") 77 .WithWriteCallback((_, __) => UpdateInterrupts()) 78 .WithReservedBits(4, 32 - 4); 79 80 Registers.InterruptTest.Define(this) 81 .WithFlag(0, FieldMode.Write, writeCallback: (_, val) => { if(val) classAInterruptTriggered.Value = true; }, name: "classa") 82 .WithFlag(1, FieldMode.Write, writeCallback: (_, val) => { if(val) classBInterruptTriggered.Value = true; }, name: "classb") 83 .WithFlag(2, FieldMode.Write, writeCallback: (_, val) => { if(val) classCInterruptTriggered.Value = true; }, name: "classc") 84 .WithFlag(3, FieldMode.Write, writeCallback: (_, val) => { if(val) classDInterruptTriggered.Value = true; }, name: "classd") 85 .WithWriteCallback((_, val) => { if(val != 0) UpdateInterrupts(); }) 86 .WithReservedBits(4, 32 - 4); 87 88 Registers.PingTimerRegisterWriteEnable.Define(this, 0x1) 89 .WithTaggedFlag("PING_TIMER_REGWEN", 0) 90 .WithReservedBits(1, 31) 91 // Locking registers means that the configuration is complete and the feature may be enabled. 92 // This very moment we should start `pinging` connected peripherals 93 .WithWriteCallback((_, val) => { if(val == 0) PingTimeout(); }); 94 95 Registers.PingTimeoutCycle.Define(this, 0x100) 96 .WithValueField(0, 16, out pingTimeout, name: "PING_TIMEOUT_CYC_SHADOWED") 97 .WithReservedBits(16, 16); 98 99 Registers.PingTimerEnable.Define(this) 100 // The `Read | Set` mode means that it cannot be disabled - this is intentional 101 .WithFlag(0, out pingTimeoutEnable, FieldMode.Read | FieldMode.Set, name: "PING_TIMER_EN_SHADOWED") 102 .WithReservedBits(1, 31); 103 104 Registers.AlertRegisterWriteEnable0.DefineMany(this, AlertsCount, resetValue: 0x1, setup: (register, idx) => 105 register 106 // The value of this register does not matter. We just need it to retain value 107 .WithFlag(0, FieldMode.Read | FieldMode.WriteZeroToClear, name: $"EN_{idx}") 108 .WithReservedBits(1, 31)); 109 110 Registers.AlertEnable0.DefineMany(this, AlertsCount, (register, idx) => 111 register 112 .WithFlag(0, out alertEnabled[idx], name: $"EN_A_{idx}") 113 .WithReservedBits(1, 31)); 114 115 Registers.AlertClass0.DefineMany(this, AlertsCount, (register, idx) => 116 register 117 .WithEnumField<DoubleWordRegister, AlertClass>(0, 2, out alertClasses[idx], name: $"CLASS_A_{idx}") 118 .WithReservedBits(2, 30)); 119 120 Registers.AlertCause0.DefineMany(this, AlertsCount, (register, idx) => 121 register 122 .WithFlag(0, out alertCause[idx], FieldMode.Read | FieldMode.WriteOneToClear, name: $"A_{idx}") 123 .WithReservedBits(1, 31)); 124 125 Registers.LocalAlertRegisterWriteEnable0.DefineMany(this, LocalAlertsCount, resetValue: 0x1, setup: (register, idx) => 126 register 127 // The value of this register does not matter. We just need it to retain value 128 .WithFlag(0, FieldMode.Read | FieldMode.WriteZeroToClear, name: $"EN_{idx}") 129 .WithReservedBits(1, 31)); 130 131 Registers.LocalAlertEnable0.DefineMany(this, LocalAlertsCount, (register, idx) => 132 register 133 .WithFlag(0, out localAlertEnabled[idx], name: $"EN_LA_{idx}") 134 .WithReservedBits(1, 31)); 135 136 Registers.LocalAlertClass0.DefineMany(this, LocalAlertsCount, (register, idx) => 137 register 138 .WithEnumField<DoubleWordRegister, AlertClass>(0, 2, out localAlertClasses[idx], name: $"CLASS_LA_{idx}") 139 .WithReservedBits(2, 30)); 140 141 Registers.LocalAlertCause0.DefineMany(this, LocalAlertsCount, (register, idx) => 142 register 143 .WithFlag(0, out localAlertCause[idx], FieldMode.Read | FieldMode.WriteOneToClear, name: $"LA_{idx}") 144 .WithReservedBits(1, 31)); 145 146 var controlRegisterOffset = Registers.ClassAControl - Registers.ClassARegisterWriteEnable; 147 var clearWenRegisterOffset = Registers.ClassAClearRegisterWriteEnable - Registers.ClassARegisterWriteEnable; 148 var clearRegisterOffset = Registers.ClassAClear - Registers.ClassARegisterWriteEnable; 149 var accumulationRegisterOffset = Registers.ClassAAccumulationCount - Registers.ClassARegisterWriteEnable; 150 var accumulationThresholdRegisterOffset = Registers.ClassAAccumulationThreshold - Registers.ClassARegisterWriteEnable; 151 var timeoutCycleRegisterOffset = Registers.ClassATimeoutCycle - Registers.ClassARegisterWriteEnable; 152 var crashdumpTriggerRegisterOffset = Registers.ClassACrashdumpTrigger - Registers.ClassARegisterWriteEnable; 153 var phase0CycleRegisterOffset = Registers.ClassAPhase0Cycle - Registers.ClassARegisterWriteEnable; 154 var phase1CycleRegisterOffset = Registers.ClassAPhase1Cycle - Registers.ClassARegisterWriteEnable; 155 var phase2CycleRegisterOffset = Registers.ClassAPhase2Cycle - Registers.ClassARegisterWriteEnable; 156 var phase3RegisterOffset = Registers.ClassAPhase3Cycle - Registers.ClassARegisterWriteEnable; 157 var escalationCountRegisterOffset = Registers.ClassAEscalationCount - Registers.ClassARegisterWriteEnable; 158 var stateRegisterOffset = Registers.ClassAState - Registers.ClassARegisterWriteEnable; 159 160 foreach(var entry in new Dictionary<string, Registers> {{"A", Registers.ClassARegisterWriteEnable}, 161 {"B", Registers.ClassBRegisterWriteEnable}, 162 {"C", Registers.ClassCRegisterWriteEnable}, 163 {"D", Registers.ClassDRegisterWriteEnable}}) 164 { 165 var className = entry.Key; 166 var firstRegister = entry.Value; 167 ((Registers)firstRegister).Define(this, 0x1) 168 .WithTaggedFlag($"CLASS${className}_REGWEN", 0) 169 .WithReservedBits(1, 31); 170 171 ((Registers)(firstRegister + controlRegisterOffset)).Define(this, 0x393c) 172 .WithTaggedFlag("EN", 0) 173 .WithTaggedFlag("LOCK", 1) 174 .WithTaggedFlag("EN_E0", 2) 175 .WithTaggedFlag("EN_E1", 3) 176 .WithTaggedFlag("EN_E2", 4) 177 .WithTaggedFlag("EN_E3", 5) 178 .WithTag("MAP_E0", 6, 2) 179 .WithTag("MAP_E1", 8, 2) 180 .WithTag("MAP_E2", 10, 2) 181 .WithTag("MAP_E3", 12, 2) 182 .WithReservedBits(14, 32 - 14); 183 184 ((Registers)(firstRegister + clearWenRegisterOffset)).Define(this, 0x1) 185 .WithTaggedFlag($"CLASS${className}_CLR_REGWEN", 0) 186 .WithReservedBits(1, 31); 187 188 ((Registers)(firstRegister + clearRegisterOffset)).Define(this, 0x1) 189 .WithTaggedFlag($"CLASS${className}_CLR_SHADOWED", 0) 190 .WithIgnoredBits(1, 31); 191 192 ((Registers)(firstRegister + accumulationRegisterOffset)).Define(this) 193 .WithTag($"CLASS${className}_ACCUM_CNT", 0, 16) 194 .WithReservedBits(16, 16); 195 196 ((Registers)(firstRegister + accumulationThresholdRegisterOffset)).Define(this) 197 .WithTag($"CLASS${className}_ACCUM_THRESH_SHADOWED", 0, 16) 198 .WithReservedBits(16, 16); 199 200 ((Registers)(firstRegister + timeoutCycleRegisterOffset)).Define(this) 201 .WithTag($"CLASS${className}_TIMEOUT_CYC_SHADOWED", 0, 32); 202 203 ((Registers)(firstRegister + crashdumpTriggerRegisterOffset)).Define(this) 204 .WithTag($"CLASS${className}_CRASHDUMP_TRIGGER_SHADOWED", 0, 2) 205 .WithReservedBits(2, 30); 206 207 ((Registers)(firstRegister + phase0CycleRegisterOffset)).Define(this) 208 .WithTag($"CLASS${className}_PHASE0_CYC_SHADOWED", 0, 32); 209 210 ((Registers)(firstRegister + phase1CycleRegisterOffset)).Define(this) 211 .WithTag($"CLASS${className}_PHASE1_CYC_SHADOWED", 0, 32); 212 213 ((Registers)(firstRegister + phase2CycleRegisterOffset)).Define(this, 0x1) 214 .WithTag($"CLASS${className}_PHASE2_CYC_SHADOWED", 0, 32); 215 216 ((Registers)(firstRegister + phase3RegisterOffset)).Define(this, 0xa) 217 .WithTag($"CLASS${className}_PHASE3_CYC_SHADOWED", 0, 32); 218 219 ((Registers)(firstRegister + escalationCountRegisterOffset)).Define(this, 0x64) 220 .WithTag($"CLASS${className}_ESC_CNT", 0, 32); 221 222 ((Registers)(firstRegister + stateRegisterOffset)).Define(this, 0x0) 223 .WithTag($"CLASS${className}_STATE", 0, 2) 224 .WithIgnoredBits(2, 30); 225 } 226 } 227 PingTimeout()228 private void PingTimeout() 229 { 230 // We don't implement the ping timeout fully, the only case we handle is the known alert condition - when the timeout is lower or equal to the ping response `pause cycles` defined in the hardware. 231 // In that case we prepare to throw a local alert during the next execution sync. The reason it is postponed is that the software might execute wfi in the few next instructions. 232 if(!pingTimeoutEnable.Value || pingTimeout.Value > PingPauseCycles) 233 { 234 return; 235 } 236 this.machine.LocalTimeSource.ExecuteInNearestSyncedState(_ => OnLocalAlert(LocalCauses.AlertPingFail)); 237 } 238 OnLocalAlert(LocalCauses alert)239 private void OnLocalAlert(LocalCauses alert) 240 { 241 var index = (int) alert; 242 localAlertCause[index].Value = true; 243 var enabled = localAlertEnabled[index].Value; 244 245 if(enabled) 246 { 247 var alertClass = localAlertClasses[index].Value; 248 HandleAlertOfClass(alertClass); 249 } 250 } 251 HandleAlertOfClass(AlertClass alertClass)252 private void HandleAlertOfClass(AlertClass alertClass) 253 { 254 switch(alertClass) 255 { 256 case AlertClass.A: 257 classAInterruptTriggered.Value = true; 258 break; 259 case AlertClass.B: 260 classBInterruptTriggered.Value = true; 261 break; 262 case AlertClass.C: 263 classCInterruptTriggered.Value = true; 264 break; 265 case AlertClass.D: 266 classDInterruptTriggered.Value = true; 267 break; 268 default: 269 throw new ArgumentException("Unknown alert class"); 270 } 271 UpdateInterrupts(); 272 } 273 UpdateInterrupts()274 private void UpdateInterrupts() 275 { 276 ClassAInterrupt.Set(classAInterruptTriggered.Value && classAInterruptEnable.Value); 277 ClassBInterrupt.Set(classBInterruptTriggered.Value && classBInterruptEnable.Value); 278 ClassCInterrupt.Set(classCInterruptTriggered.Value && classCInterruptEnable.Value); 279 ClassDInterrupt.Set(classDInterruptTriggered.Value && classDInterruptEnable.Value); 280 } 281 282 private IFlagRegisterField classAInterruptTriggered; 283 private IFlagRegisterField classBInterruptTriggered; 284 private IFlagRegisterField classCInterruptTriggered; 285 private IFlagRegisterField classDInterruptTriggered; 286 private IFlagRegisterField classAInterruptEnable; 287 private IFlagRegisterField classBInterruptEnable; 288 private IFlagRegisterField classCInterruptEnable; 289 private IFlagRegisterField classDInterruptEnable; 290 private IFlagRegisterField pingTimeoutEnable; 291 292 private IValueRegisterField pingTimeout; 293 294 private readonly IEnumRegisterField<AlertClass>[] alertClasses; 295 private readonly IEnumRegisterField<AlertClass>[] localAlertClasses; 296 private readonly IFlagRegisterField[] alertEnabled; 297 private readonly IFlagRegisterField[] alertCause; 298 private readonly IFlagRegisterField[] localAlertEnabled; 299 private readonly IFlagRegisterField[] localAlertCause; 300 301 private const uint AlertsCount = 65; 302 private const uint LocalAlertsCount = 7; 303 private const uint PingPauseCycles = 2; 304 305 #pragma warning disable format 306 private enum AlertClass 307 { 308 A = 0, 309 B = 1, 310 C = 2, 311 D = 3, 312 } 313 314 private enum LocalCauses 315 { 316 AlertPingFail = 0, 317 EscalationPingFail = 1, 318 AlertIntegrityFail = 2, 319 EscalationIntegrityFail = 3, 320 BusIntegrityFail = 4, 321 ShadowRegisterUpdateError = 5, 322 ShadowRegisterStorageError = 6, 323 } 324 325 public enum Registers 326 { 327 InterruptState = 0x0, 328 InterruptEnable = 0x4, 329 InterruptTest = 0x8, 330 PingTimerRegisterWriteEnable = 0xc, 331 PingTimeoutCycle = 0x10, 332 PingTimerEnable = 0x14, 333 AlertRegisterWriteEnable0 = 0x18, 334 AlertRegisterWriteEnable1 = 0x1c, 335 AlertRegisterWriteEnable2 = 0x20, 336 AlertRegisterWriteEnable3 = 0x24, 337 AlertRegisterWriteEnable4 = 0x28, 338 AlertRegisterWriteEnable5 = 0x2c, 339 AlertRegisterWriteEnable6 = 0x30, 340 AlertRegisterWriteEnable7 = 0x34, 341 AlertRegisterWriteEnable8 = 0x38, 342 AlertRegisterWriteEnable9 = 0x3c, 343 AlertRegisterWriteEnable10 = 0x40, 344 AlertRegisterWriteEnable11 = 0x44, 345 AlertRegisterWriteEnable12 = 0x48, 346 AlertRegisterWriteEnable13 = 0x4c, 347 AlertRegisterWriteEnable14 = 0x50, 348 AlertRegisterWriteEnable15 = 0x54, 349 AlertRegisterWriteEnable16 = 0x58, 350 AlertRegisterWriteEnable17 = 0x5c, 351 AlertRegisterWriteEnable18 = 0x60, 352 AlertRegisterWriteEnable19 = 0x64, 353 AlertRegisterWriteEnable20 = 0x68, 354 AlertRegisterWriteEnable21 = 0x6c, 355 AlertRegisterWriteEnable22 = 0x70, 356 AlertRegisterWriteEnable23 = 0x74, 357 AlertRegisterWriteEnable24 = 0x78, 358 AlertRegisterWriteEnable25 = 0x7c, 359 AlertRegisterWriteEnable26 = 0x80, 360 AlertRegisterWriteEnable27 = 0x84, 361 AlertRegisterWriteEnable28 = 0x88, 362 AlertRegisterWriteEnable29 = 0x8c, 363 AlertRegisterWriteEnable30 = 0x90, 364 AlertRegisterWriteEnable31 = 0x94, 365 AlertRegisterWriteEnable32 = 0x98, 366 AlertRegisterWriteEnable33 = 0x9c, 367 AlertRegisterWriteEnable34 = 0xa0, 368 AlertRegisterWriteEnable35 = 0xa4, 369 AlertRegisterWriteEnable36 = 0xa8, 370 AlertRegisterWriteEnable37 = 0xac, 371 AlertRegisterWriteEnable38 = 0xb0, 372 AlertRegisterWriteEnable39 = 0xb4, 373 AlertRegisterWriteEnable40 = 0xb8, 374 AlertRegisterWriteEnable41 = 0xbc, 375 AlertRegisterWriteEnable42 = 0xc0, 376 AlertRegisterWriteEnable43 = 0xc4, 377 AlertRegisterWriteEnable44 = 0xc8, 378 AlertRegisterWriteEnable45 = 0xcc, 379 AlertRegisterWriteEnable46 = 0xd0, 380 AlertRegisterWriteEnable47 = 0xd4, 381 AlertRegisterWriteEnable48 = 0xd8, 382 AlertRegisterWriteEnable49 = 0xdc, 383 AlertRegisterWriteEnable50 = 0xe0, 384 AlertRegisterWriteEnable51 = 0xe4, 385 AlertRegisterWriteEnable52 = 0xe8, 386 AlertRegisterWriteEnable53 = 0xec, 387 AlertRegisterWriteEnable54 = 0xf0, 388 AlertRegisterWriteEnable55 = 0xf4, 389 AlertRegisterWriteEnable56 = 0xf8, 390 AlertRegisterWriteEnable57 = 0xfc, 391 AlertRegisterWriteEnable58 = 0x100, 392 AlertRegisterWriteEnable59 = 0x104, 393 AlertRegisterWriteEnable60 = 0x108, 394 AlertRegisterWriteEnable61 = 0x10c, 395 AlertRegisterWriteEnable62 = 0x110, 396 AlertRegisterWriteEnable63 = 0x114, 397 AlertRegisterWriteEnable64 = 0x118, 398 AlertEnable0 = 0x10c+0x10, 399 AlertEnable1 = 0x110+0x10, 400 AlertEnable2 = 0x114+0x10, 401 AlertEnable3 = 0x118+0x10, 402 AlertEnable4 = 0x11c+0x10, 403 AlertEnable5 = 0x120+0x10, 404 AlertEnable6 = 0x124+0x10, 405 AlertEnable7 = 0x128+0x10, 406 AlertEnable8 = 0x12c+0x10, 407 AlertEnable9 = 0x130+0x10, 408 AlertEnable10 = 0x134+0x10, 409 AlertEnable11 = 0x138+0x10, 410 AlertEnable12 = 0x13c+0x10, 411 AlertEnable13 = 0x140+0x10, 412 AlertEnable14 = 0x144+0x10, 413 AlertEnable15 = 0x148+0x10, 414 AlertEnable16 = 0x14c+0x10, 415 AlertEnable17 = 0x150+0x10, 416 AlertEnable18 = 0x154+0x10, 417 AlertEnable19 = 0x158+0x10, 418 AlertEnable20 = 0x15c+0x10, 419 AlertEnable21 = 0x160+0x10, 420 AlertEnable22 = 0x164+0x10, 421 AlertEnable23 = 0x168+0x10, 422 AlertEnable24 = 0x16c+0x10, 423 AlertEnable25 = 0x170+0x10, 424 AlertEnable26 = 0x174+0x10, 425 AlertEnable27 = 0x178+0x10, 426 AlertEnable28 = 0x17c+0x10, 427 AlertEnable29 = 0x180+0x10, 428 AlertEnable30 = 0x184+0x10, 429 AlertEnable31 = 0x188+0x10, 430 AlertEnable32 = 0x18c+0x10, 431 AlertEnable33 = 0x190+0x10, 432 AlertEnable34 = 0x194+0x10, 433 AlertEnable35 = 0x198+0x10, 434 AlertEnable36 = 0x19c+0x10, 435 AlertEnable37 = 0x1a0+0x10, 436 AlertEnable38 = 0x1a4+0x10, 437 AlertEnable39 = 0x1a8+0x10, 438 AlertEnable40 = 0x1ac+0x10, 439 AlertEnable41 = 0x1b0+0x10, 440 AlertEnable42 = 0x1b4+0x10, 441 AlertEnable43 = 0x1b8+0x10, 442 AlertEnable44 = 0x1bc+0x10, 443 AlertEnable45 = 0x1c0+0x10, 444 AlertEnable46 = 0x1c4+0x10, 445 AlertEnable47 = 0x1c8+0x10, 446 AlertEnable48 = 0x1cc+0x10, 447 AlertEnable49 = 0x1d0+0x10, 448 AlertEnable50 = 0x1d4+0x10, 449 AlertEnable51 = 0x1d8+0x10, 450 AlertEnable52 = 0x1dc+0x10, 451 AlertEnable53 = 0x1e0+0x10, 452 AlertEnable54 = 0x1e4+0x10, 453 AlertEnable55 = 0x1e8+0x10, 454 AlertEnable56 = 0x1ec+0x10, 455 AlertEnable57 = 0x1f0+0x10, 456 AlertEnable58 = 0x1f4+0x10, 457 AlertEnable59 = 0x1f8+0x10, 458 AlertEnable60 = 0x1fc+0x10, 459 AlertEnable61 = 0x200+0x10, 460 AlertEnable62 = 0x204+0x10, 461 AlertEnable63 = 0x208+0x10, 462 AlertEnable64 = 0x20c+0x10, 463 AlertClass0 = 0x200+0x20, 464 AlertClass1 = 0x204+0x20, 465 AlertClass2 = 0x208+0x20, 466 AlertClass3 = 0x20c+0x20, 467 AlertClass4 = 0x210+0x20, 468 AlertClass5 = 0x214+0x20, 469 AlertClass6 = 0x218+0x20, 470 AlertClass7 = 0x21c+0x20, 471 AlertClass8 = 0x220+0x20, 472 AlertClass9 = 0x224+0x20, 473 AlertClass10 = 0x228+0x20, 474 AlertClass11 = 0x22c+0x20, 475 AlertClass12 = 0x230+0x20, 476 AlertClass13 = 0x234+0x20, 477 AlertClass14 = 0x238+0x20, 478 AlertClass15 = 0x23c+0x20, 479 AlertClass16 = 0x240+0x20, 480 AlertClass17 = 0x244+0x20, 481 AlertClass18 = 0x248+0x20, 482 AlertClass19 = 0x24c+0x20, 483 AlertClass20 = 0x250+0x20, 484 AlertClass21 = 0x254+0x20, 485 AlertClass22 = 0x258+0x20, 486 AlertClass23 = 0x25c+0x20, 487 AlertClass24 = 0x260+0x20, 488 AlertClass25 = 0x264+0x20, 489 AlertClass26 = 0x268+0x20, 490 AlertClass27 = 0x26c+0x20, 491 AlertClass28 = 0x270+0x20, 492 AlertClass29 = 0x274+0x20, 493 AlertClass30 = 0x278+0x20, 494 AlertClass31 = 0x27c+0x20, 495 AlertClass32 = 0x280+0x20, 496 AlertClass33 = 0x284+0x20, 497 AlertClass34 = 0x288+0x20, 498 AlertClass35 = 0x28c+0x20, 499 AlertClass36 = 0x290+0x20, 500 AlertClass37 = 0x294+0x20, 501 AlertClass38 = 0x298+0x20, 502 AlertClass39 = 0x29c+0x20, 503 AlertClass40 = 0x2a0+0x20, 504 AlertClass41 = 0x2a4+0x20, 505 AlertClass42 = 0x2a8+0x20, 506 AlertClass43 = 0x2ac+0x20, 507 AlertClass44 = 0x2b0+0x20, 508 AlertClass45 = 0x2b4+0x20, 509 AlertClass46 = 0x2b8+0x20, 510 AlertClass47 = 0x2bc+0x20, 511 AlertClass48 = 0x2c0+0x20, 512 AlertClass49 = 0x2c4+0x20, 513 AlertClass50 = 0x2c8+0x20, 514 AlertClass51 = 0x2cc+0x20, 515 AlertClass52 = 0x2d0+0x20, 516 AlertClass53 = 0x2d4+0x20, 517 AlertClass54 = 0x2d8+0x20, 518 AlertClass55 = 0x2dc+0x20, 519 AlertClass56 = 0x2e0+0x20, 520 AlertClass57 = 0x2e4+0x20, 521 AlertClass58 = 0x2e8+0x20, 522 AlertClass59 = 0x2ec+0x20, 523 AlertClass60 = 0x2f0+0x20, 524 AlertClass61 = 0x2f4+0x20, 525 AlertClass62 = 0x2f8+0x20, 526 AlertClass63 = 0x2fc+0x20, 527 AlertClass64 = 0x300+0x20, 528 AlertCause0 = 0x2f4+0x30, 529 AlertCause1 = 0x2f8+0x30, 530 AlertCause2 = 0x2fc+0x30, 531 AlertCause3 = 0x300+0x30, 532 AlertCause4 = 0x304+0x30, 533 AlertCause5 = 0x308+0x30, 534 AlertCause6 = 0x30c+0x30, 535 AlertCause7 = 0x310+0x30, 536 AlertCause8 = 0x314+0x30, 537 AlertCause9 = 0x318+0x30, 538 AlertCause10 = 0x31c+0x30, 539 AlertCause11 = 0x320+0x30, 540 AlertCause12 = 0x324+0x30, 541 AlertCause13 = 0x328+0x30, 542 AlertCause14 = 0x32c+0x30, 543 AlertCause15 = 0x330+0x30, 544 AlertCause16 = 0x334+0x30, 545 AlertCause17 = 0x338+0x30, 546 AlertCause18 = 0x33c+0x30, 547 AlertCause19 = 0x340+0x30, 548 AlertCause20 = 0x344+0x30, 549 AlertCause21 = 0x348+0x30, 550 AlertCause22 = 0x34c+0x30, 551 AlertCause23 = 0x350+0x30, 552 AlertCause24 = 0x354+0x30, 553 AlertCause25 = 0x358+0x30, 554 AlertCause26 = 0x35c+0x30, 555 AlertCause27 = 0x360+0x30, 556 AlertCause28 = 0x364+0x30, 557 AlertCause29 = 0x368+0x30, 558 AlertCause30 = 0x36c+0x30, 559 AlertCause31 = 0x370+0x30, 560 AlertCause32 = 0x374+0x30, 561 AlertCause33 = 0x378+0x30, 562 AlertCause34 = 0x37c+0x30, 563 AlertCause35 = 0x380+0x30, 564 AlertCause36 = 0x384+0x30, 565 AlertCause37 = 0x388+0x30, 566 AlertCause38 = 0x38c+0x30, 567 AlertCause39 = 0x390+0x30, 568 AlertCause40 = 0x394+0x30, 569 AlertCause41 = 0x398+0x30, 570 AlertCause42 = 0x39c+0x30, 571 AlertCause43 = 0x3a0+0x30, 572 AlertCause44 = 0x3a4+0x30, 573 AlertCause45 = 0x3a8+0x30, 574 AlertCause46 = 0x3ac+0x30, 575 AlertCause47 = 0x3b0+0x30, 576 AlertCause48 = 0x3b4+0x30, 577 AlertCause49 = 0x3b8+0x30, 578 AlertCause50 = 0x3bc+0x30, 579 AlertCause51 = 0x3c0+0x30, 580 AlertCause52 = 0x3c4+0x30, 581 AlertCause53 = 0x3c8+0x30, 582 AlertCause54 = 0x3cc+0x30, 583 AlertCause55 = 0x3d0+0x30, 584 AlertCause56 = 0x3d4+0x30, 585 AlertCause57 = 0x3d8+0x30, 586 AlertCause58 = 0x3dc+0x30, 587 AlertCause59 = 0x3e0+0x30, 588 AlertCause60 = 0x3e4+0x30, 589 AlertCause61 = 0x3e8+0x30, 590 AlertCause62 = 0x3ec+0x30, 591 AlertCause63 = 0x3f0+0x30, 592 AlertCause64 = 0x3f4+0x30, 593 LocalAlertRegisterWriteEnable0 = 0x3e8+0x40, 594 LocalAlertRegisterWriteEnable1 = 0x3ec+0x40, 595 LocalAlertRegisterWriteEnable2 = 0x3f0+0x40, 596 LocalAlertRegisterWriteEnable3 = 0x3f4+0x40, 597 LocalAlertRegisterWriteEnable4 = 0x3f8+0x40, 598 LocalAlertRegisterWriteEnable5 = 0x3fc+0x40, 599 LocalAlertRegisterWriteEnable6 = 0x400+0x40, 600 LocalAlertEnable0 = 0x404+0x40, 601 LocalAlertEnable1 = 0x408+0x40, 602 LocalAlertEnable2 = 0x40c+0x40, 603 LocalAlertEnable3 = 0x410+0x40, 604 LocalAlertEnable4 = 0x414+0x40, 605 LocalAlertEnable5 = 0x418+0x40, 606 LocalAlertEnable6 = 0x41c+0x40, 607 LocalAlertClass0 = 0x420+0x40, 608 LocalAlertClass1 = 0x424+0x40, 609 LocalAlertClass2 = 0x428+0x40, 610 LocalAlertClass3 = 0x42c+0x40, 611 LocalAlertClass4 = 0x430+0x40, 612 LocalAlertClass5 = 0x434+0x40, 613 LocalAlertClass6 = 0x438+0x40, 614 LocalAlertCause0 = 0x43c+0x40, 615 LocalAlertCause1 = 0x440+0x40, 616 LocalAlertCause2 = 0x444+0x40, 617 LocalAlertCause3 = 0x448+0x40, 618 LocalAlertCause4 = 0x44c+0x40, 619 LocalAlertCause5 = 0x450+0x40, 620 LocalAlertCause6 = 0x454+0x40, 621 ClassARegisterWriteEnable = 0x458+0x40, 622 ClassAControl = 0x45c+0x40, 623 ClassAClearRegisterWriteEnable = 0x460+0x40, 624 ClassAClear = 0x464+0x40, 625 ClassAAccumulationCount = 0x468+0x40, 626 ClassAAccumulationThreshold = 0x46C+0x40, 627 ClassATimeoutCycle = 0x470+0x40, 628 ClassACrashdumpTrigger = 0x474+0x40, 629 ClassAPhase0Cycle = 0x478+0x40, 630 ClassAPhase1Cycle = 0x47C+0x40, 631 ClassAPhase2Cycle = 0x480+0x40, 632 ClassAPhase3Cycle = 0x484+0x40, 633 ClassAEscalationCount = 0x488+0x40, 634 ClassAState = 0x48C+0x40, 635 ClassBRegisterWriteEnable = 0x490+0x40, 636 ClassBControl = 0x494+0x40, 637 ClassBClearRegisterWriteEnable = 0x498+0x40, 638 ClassBClear = 0x49C+0x40, 639 ClassBAccumulationCount = 0x4A0+0x40, 640 ClassBAccumulationThreshold = 0x4A4+0x40, 641 ClassBTimeoutCycle = 0x4A8+0x40, 642 ClassBCrashdumpTrigger = 0x4AC+0x40, 643 ClassBPhase0Cycle = 0x4B0+0x40, 644 ClassBPhase1Cycle = 0x4B4+0x40, 645 ClassBPhase2Cycle = 0x4B8+0x40, 646 ClassBPhase3Cycle = 0x4BC+0x40, 647 ClassBEscalationCount = 0x4C0+0x40, 648 ClassBState = 0x4C4+0x40, 649 ClassCRegisterWriteEnable = 0x4C8+0x40, 650 ClassCControl = 0x4CC+0x40, 651 ClassCClearRegisterWriteEnable = 0x4D0+0x40, 652 ClassCClear = 0x4D4+0x40, 653 ClassCAccumulationCount = 0x4D8+0x40, 654 ClassCAccumulationThreshold = 0x4DC+0x40, 655 ClassCTimeoutCycle = 0x4E0+0x40, 656 ClassCCrashdumpTrigger = 0x4E4+0x40, 657 ClassCPhase0Cycle = 0x4E8+0x40, 658 ClassCPhase1Cycle = 0x4EC+0x40, 659 ClassCPhase2Cycle = 0x4F0+0x40, 660 ClassCPhase3Cycle = 0x4F4+0x40, 661 ClassCEscalationCount = 0x4F8+0x40, 662 ClassCState = 0x4FC+0x40, 663 ClassDRegisterWriteEnable = 0x500+0x40, 664 ClassDControl = 0x504+0x40, 665 ClassDClearRegisterWriteEnable = 0x508+0x40, 666 ClassDClear = 0x50C+0x40, 667 ClassDAccumulationCount = 0x510+0x40, 668 ClassDAccumulationThreshold = 0x514+0x40, 669 ClassDTimeoutCycle = 0x518+0x40, 670 ClassDCrashdumpTrigger = 0x51C+0x40, 671 ClassDPhase0Cycle = 0x520+0x40, 672 ClassDPhase1Cycle = 0x524+0x40, 673 ClassDPhase2Cycle = 0x528+0x40, 674 ClassDPhase3Cycle = 0x52C+0x40, 675 ClassDEscalationCount = 0x530+0x40, 676 ClassDState = 0x534+0x40, 677 } 678 #pragma warning restore format 679 } 680 } 681