diff --git a/headers/private/kernel/arch/ppc/arch_cpu.h b/headers/private/kernel/arch/ppc/arch_cpu.h index f352f38403..38b816ab81 100644 --- a/headers/private/kernel/arch/ppc/arch_cpu.h +++ b/headers/private/kernel/arch/ppc/arch_cpu.h @@ -59,7 +59,14 @@ struct iframe { uint32 r0; }; -#define MSR_IP (1L << 6) +enum machine_state { + MSR_PRIVILEGE_LEVEL = 1L << 14, // PR + MSR_FP_AVAILABLE = 1L << 13, // FP + MSR_MACHINE_CHECK_ENABLED = 1L << 12, // ME + MSR_EXCEPTION_PREFIX = 1L << 6, // IP + MSR_INST_ADDRESS_TRANSLATION = 1L << 5, // IR + MSR_DATA_ADDRESS_TRANSLATION = 1L << 4, // DR +}; struct block_address_translation; @@ -83,6 +90,18 @@ extern void set_dbat1(struct block_address_translation *bat); extern void set_dbat2(struct block_address_translation *bat); extern void set_dbat3(struct block_address_translation *bat); +extern void get_ibat0(struct block_address_translation *bat); +extern void get_ibat1(struct block_address_translation *bat); +extern void get_ibat2(struct block_address_translation *bat); +extern void get_ibat3(struct block_address_translation *bat); +extern void get_dbat0(struct block_address_translation *bat); +extern void get_dbat1(struct block_address_translation *bat); +extern void get_dbat2(struct block_address_translation *bat); +extern void get_dbat3(struct block_address_translation *bat); + +extern void reset_ibats(void); +extern void reset_dbats(void); + //extern void sethid0(unsigned int val); //extern unsigned int getl2cr(void); //extern void setl2cr(unsigned int val); @@ -96,5 +115,6 @@ extern void ppc_context_switch(void **_oldStackPointer, void *newStackPointer); #define eieio() asm volatile("eieio") #define isync() asm volatile("isync") +#define tlbsync() asm volatile("tlbsync") #endif /* _KERNEL_ARCH_PPC_CPU_H */ diff --git a/headers/private/kernel/arch/ppc/arch_mmu.h b/headers/private/kernel/arch/ppc/arch_mmu.h index c441c5e087..5f31580cf3 100644 --- a/headers/private/kernel/arch/ppc/arch_mmu.h +++ b/headers/private/kernel/arch/ppc/arch_mmu.h @@ -9,6 +9,8 @@ #include #include +#include + /*** BAT - block address translation ***/ @@ -48,6 +50,11 @@ struct block_address_translation { uint32 _reserved1 : 1; uint32 protection : 2; + block_address_translation() + { + Clear(); + } + void SetVirtualAddress(void *address) { page_index = uint32(address) >> 17; @@ -71,6 +78,21 @@ struct segment_descriptor { uint32 no_execute_protection : 1; uint32 _reserved : 4; uint32 virtual_segment_id : 24; + + segment_descriptor() + { + Clear(); + } + + segment_descriptor(uint32 value) + { + *((uint32 *)this) = value; + } + + void Clear() + { + memset((void *)this, 0, sizeof(segment_descriptor)); + } }; @@ -111,4 +133,17 @@ struct page_table_entry_group { extern void ppc_get_page_table(page_table_entry_group **_pageTable, size_t *_size); extern void ppc_set_page_table(page_table_entry_group *pageTable, size_t size); +static inline segment_descriptor +ppc_get_segment_register(void *virtualAddress) +{ + return (segment_descriptor)get_sr(virtualAddress); +} + + +static inline void +ppc_set_segment_register(void *virtualAddress, segment_descriptor segment) +{ + set_sr(virtualAddress, *(uint32 *)&segment); +} + #endif /* _KERNEL_ARCH_PPC_MMU_H */