330
return 0;
331
}
332
333
-/*
334
- * Default priorities of local interrupts are defined in the
335
- * RISC-V Advanced Interrupt Architecture specification.
336
- *
337
- * ----------------------------------------------------------------
338
- * Default |
339
- * Priority | Major Interrupt Numbers
340
- * ----------------------------------------------------------------
341
- * Highest | 47, 23, 46, 45, 22, 44,
342
- * | 43, 21, 42, 41, 20, 40
343
- * |
344
- * | 11 (0b), 3 (03), 7 (07)
345
- * | 9 (09), 1 (01), 5 (05)
346
- * | 12 (0c)
347
- * | 10 (0a), 2 (02), 6 (06)
348
- * |
349
- * | 39, 19, 38, 37, 18, 36,
350
- * Lowest | 35, 17, 34, 33, 16, 32
351
- * ----------------------------------------------------------------
352
- */
353
-static const uint8_t default_iprio[64] = {
354
- /* Custom interrupts 48 to 63 */
355
- [63] = IPRIO_MMAXIPRIO,
356
- [62] = IPRIO_MMAXIPRIO,
357
- [61] = IPRIO_MMAXIPRIO,
358
- [60] = IPRIO_MMAXIPRIO,
359
- [59] = IPRIO_MMAXIPRIO,
360
- [58] = IPRIO_MMAXIPRIO,
361
- [57] = IPRIO_MMAXIPRIO,
362
- [56] = IPRIO_MMAXIPRIO,
363
- [55] = IPRIO_MMAXIPRIO,
364
- [54] = IPRIO_MMAXIPRIO,
365
- [53] = IPRIO_MMAXIPRIO,
366
- [52] = IPRIO_MMAXIPRIO,
367
- [51] = IPRIO_MMAXIPRIO,
368
- [50] = IPRIO_MMAXIPRIO,
369
- [49] = IPRIO_MMAXIPRIO,
370
- [48] = IPRIO_MMAXIPRIO,
371
-
372
- /* Custom interrupts 24 to 31 */
373
- [31] = IPRIO_MMAXIPRIO,
374
- [30] = IPRIO_MMAXIPRIO,
375
- [29] = IPRIO_MMAXIPRIO,
376
- [28] = IPRIO_MMAXIPRIO,
377
- [27] = IPRIO_MMAXIPRIO,
378
- [26] = IPRIO_MMAXIPRIO,
379
- [25] = IPRIO_MMAXIPRIO,
380
- [24] = IPRIO_MMAXIPRIO,
381
-
382
- [47] = IPRIO_DEFAULT_UPPER,
383
- [23] = IPRIO_DEFAULT_UPPER + 1,
384
- [46] = IPRIO_DEFAULT_UPPER + 2,
385
- [45] = IPRIO_DEFAULT_UPPER + 3,
386
- [22] = IPRIO_DEFAULT_UPPER + 4,
387
- [44] = IPRIO_DEFAULT_UPPER + 5,
388
-
389
- [43] = IPRIO_DEFAULT_UPPER + 6,
390
- [21] = IPRIO_DEFAULT_UPPER + 7,
391
- [42] = IPRIO_DEFAULT_UPPER + 8,
392
- [41] = IPRIO_DEFAULT_UPPER + 9,
393
- [20] = IPRIO_DEFAULT_UPPER + 10,
394
- [40] = IPRIO_DEFAULT_UPPER + 11,
395
-
396
- [11] = IPRIO_DEFAULT_M,
397
- [3] = IPRIO_DEFAULT_M + 1,
398
- [7] = IPRIO_DEFAULT_M + 2,
399
-
400
- [9] = IPRIO_DEFAULT_S,
401
- [1] = IPRIO_DEFAULT_S + 1,
402
- [5] = IPRIO_DEFAULT_S + 2,
403
-
404
- [12] = IPRIO_DEFAULT_SGEXT,
405
-
406
- [10] = IPRIO_DEFAULT_VS,
407
- [2] = IPRIO_DEFAULT_VS + 1,
408
- [6] = IPRIO_DEFAULT_VS + 2,
409
-
410
- [39] = IPRIO_DEFAULT_LOWER,
411
- [19] = IPRIO_DEFAULT_LOWER + 1,
412
- [38] = IPRIO_DEFAULT_LOWER + 2,
413
- [37] = IPRIO_DEFAULT_LOWER + 3,
414
- [18] = IPRIO_DEFAULT_LOWER + 4,
415
- [36] = IPRIO_DEFAULT_LOWER + 5,
416
-
417
- [35] = IPRIO_DEFAULT_LOWER + 6,
418
- [17] = IPRIO_DEFAULT_LOWER + 7,
419
- [34] = IPRIO_DEFAULT_LOWER + 8,
420
- [33] = IPRIO_DEFAULT_LOWER + 9,
421
- [16] = IPRIO_DEFAULT_LOWER + 10,
422
- [32] = IPRIO_DEFAULT_LOWER + 11,
423
-};
424
-
425
-uint8_t riscv_cpu_default_priority(int irq)
426
-{
427
- if (irq < 0 || irq > 63) {
428
- return IPRIO_MMAXIPRIO;
429
- }
430
-
431
- return default_iprio[irq] ? default_iprio[irq] : IPRIO_MMAXIPRIO;
432
-};
433
-
434
-static int riscv_cpu_pending_to_irq(CPURISCVState *env,
435
- int extirq, unsigned int extirq_def_prio,
436
- uint64_t pending, uint8_t *iprio)
437
-{
438
- int irq, best_irq = RISCV_EXCP_NONE;
439
- unsigned int prio, best_prio = UINT_MAX;
440
-
441
- if (!pending) {
442
- return RISCV_EXCP_NONE;
443
- }
444
-
445
- irq = ctz64(pending);
446
- if (!((extirq == IRQ_M_EXT) ? riscv_cpu_cfg(env)->ext_smaia :
447
- riscv_cpu_cfg(env)->ext_ssaia)) {
448
- return irq;
449
- }
450
-
451
- pending = pending >> irq;
452
- while (pending) {
453
- prio = iprio[irq];
454
- if (!prio) {
455
- if (irq == extirq) {
456
- prio = extirq_def_prio;
457
- } else {
458
- prio = (riscv_cpu_default_priority(irq) < extirq_def_prio) ?
459
- 1 : IPRIO_MMAXIPRIO;
460
- }
461
- }
462
- if ((pending & 0x1) && (prio <= best_prio)) {
463
- best_irq = irq;
464
- best_prio = prio;
465
- }
466
- irq++;
467
- pending = pending >> 1;
468
- }
469
-
470
- return best_irq;
471
-}
472
-
473
-/*
474
- * Doesn't report interrupts inserted using mvip from M-mode firmware or
475
- * using hvip bits 13:63 from HS-mode. Those are returned in
476
- * riscv_cpu_sirq_pending() and riscv_cpu_vsirq_pending().
477
- */
478
-uint64_t riscv_cpu_all_pending(CPURISCVState *env)
479
-{
480
- uint32_t gein = get_field(env->hstatus, HSTATUS_VGEIN);
481
- uint64_t vsgein = (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0;
482
- uint64_t vstip = (env->vstime_irq) ? MIP_VSTIP : 0;
483
-
484
- return (env->mip | vsgein | vstip) & env->mie;
485
-}
486
-
487
-int riscv_cpu_mirq_pending(CPURISCVState *env)
488
-{
489
- uint64_t irqs = riscv_cpu_all_pending(env) & ~env->mideleg &
490
- ~(MIP_SGEIP | MIP_VSSIP | MIP_VSTIP | MIP_VSEIP);
491
-
492
- return riscv_cpu_pending_to_irq(env, IRQ_M_EXT, IPRIO_DEFAULT_M,
493
- irqs, env->miprio);
494
-}
495
-
496
-int riscv_cpu_sirq_pending(CPURISCVState *env)
497
-{
498
- uint64_t irqs = riscv_cpu_all_pending(env) & env->mideleg & ~env->hideleg;
499
- uint64_t irqs_f = env->mvip & env->mvien & ~env->mideleg & env->sie;
500
-
501
- return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S,
502
- irqs | irqs_f, env->siprio);
503
-}
504
-
505
-int riscv_cpu_vsirq_pending(CPURISCVState *env)
506
-{
507
- uint64_t irqs = riscv_cpu_all_pending(env) & env->mideleg & env->hideleg;
508
- uint64_t irqs_f_vs = env->hvip & env->hvien & ~env->hideleg & env->vsie;
509
- uint64_t vsbits;
510
-
511
- /* Bring VS-level bits to correct position */
512
- vsbits = irqs & VS_MODE_INTERRUPTS;
513
- irqs &= ~VS_MODE_INTERRUPTS;
514
- irqs |= vsbits >> 1;
515
-
516
- return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S,
517
- (irqs | irqs_f_vs), env->hviprio);
518
-}
519
-
333
static int riscv_cpu_local_irq_pending(CPURISCVState *env)
334
{
335
uint64_t irqs, pending, mie, hsie, vsie, irqs_f, irqs_f_vs;