| #pragma once |
| |
| #include <arch/pcr.h> |
| |
| static __inline void |
| lcr3(uintptr_t val) |
| { |
| mtpcr(PCR_PTBR, val); |
| } |
| |
| static __inline uintptr_t |
| rcr3(void) |
| { |
| return mfpcr(PCR_PTBR); |
| } |
| |
| static __inline uintptr_t |
| read_pc(void) |
| { |
| uintptr_t pc; |
| asm ("rdpc %0" : "=r"(pc)); |
| return pc; |
| } |
| |
| static inline uintptr_t |
| read_bp(void) |
| { |
| /* frame pointer. yes, read_bp is a shitty name. i'll change all of |
| * them to read_fp when you read this and implement the function. =) */ |
| return 0; |
| } |
| |
| static __inline void |
| send_ipi(uint32_t who, uint8_t vector) |
| { |
| mtpcr(PCR_SEND_IPI, who); |
| } |
| |
| static __inline void |
| send_broadcast_ipi(uint8_t vector) |
| { |
| #warning "broadcast ipi?" |
| /* num_cores might not be visible here */ |
| for (int i = 0; i < num_cores; i++) |
| send_ipi(i, vector); |
| } |
| |
| static __inline void |
| clear_ipi() |
| { |
| mtpcr(PCR_CLR_IPI, 0); |
| } |