picorv32.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #ifndef PICORV32_H
  2. #define PICORV32_H
  3. #ifndef __ASSEMBLY__
  4. static inline unsigned int p_getq(unsigned int qr)
  5. {
  6. unsigned int rd;
  7. asm volatile(".insn r 0x0b, 0, 0, %0, x%1, zero"
  8. : "=r" (rd) : "K" (qr));
  9. return rd;
  10. }
  11. static inline void p_setq(unsigned int qr, unsigned int val)
  12. {
  13. asm volatile(".insn r 0x0b, 0, 1, x%1, %0, zero"
  14. : : "r" (val), "K" (qr));
  15. }
  16. static inline void p_retirq(void)
  17. {
  18. asm volatile(".insn r 0x0b, 0, 2, zero, zero, zero");
  19. __builtin_unreachable();
  20. }
  21. /*
  22. * hpa: the keepmask is a local addition.
  23. *
  24. * oldmask = irq_mask;
  25. * irq_mask = ((irq_mask & ~keepmask) ^ newmask) | MASKED
  26. *
  27. * ... where MASKED represents IRQs permanently masked
  28. * in the hardware.
  29. */
  30. static inline unsigned int
  31. p_maskirq(unsigned int newmask, unsigned int keepmask)
  32. {
  33. unsigned int oldmask;
  34. asm volatile(".insn r 0x0b, 0, 3, %0, %1, %2"
  35. : "=r" (oldmask)
  36. : "r" (newmask), "r" (keepmask));
  37. return oldmask;
  38. }
  39. /* Read the current IRQ mask without changing it */
  40. static inline unsigned int p_irqmask(void)
  41. {
  42. return p_maskirq(0, ~0);
  43. }
  44. static inline unsigned int p_waitirq(void)
  45. {
  46. unsigned int pending_mask;
  47. asm volatile(".insn r 0x0b, 0, 4, %0, zero, zero"
  48. : "=r" (pending_mask));
  49. return pending_mask;
  50. }
  51. static inline unsigned int p_timer(unsigned int newval)
  52. {
  53. unsigned int oldval;
  54. asm volatile(".insn 0x0b, 0, 5, %0, %1, zero"
  55. : "=r" (oldval) : "r" (newval));
  56. }
  57. #else /* __ASSEMBLY__ */
  58. #define q0 x0
  59. #define q1 x1
  60. #define q2 x2
  61. #define q3 x3
  62. .macro getq rd, qs
  63. .insn r 0x0b, 0, 0, \rd, \qs, zero
  64. .endm
  65. .macro setq qd, rs
  66. .insn r 0x0b, 0, 1, \qd, \rs, zero
  67. .endm
  68. .macro retirq
  69. .insn r 0x0b, 0, 2, zero, zero, zero
  70. .endm
  71. .macro maskirq rd, rs
  72. .insn r 0x0b, 0, 3, \rd, \rs, zero
  73. .endm
  74. .macro waitirq rd
  75. .insn r 0x0b, 0, 4, \rd, zero, zero
  76. .endm
  77. .macro timer rd, rs
  78. .insn r 0x0b, 0, 5, \rd, \rs, zero
  79. .endm
  80. #endif /* __ASSEMBLY__ */
  81. #endif /* PICORV32_H */