| #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); | 
 | } |