summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/haleakala/include/mmu_405.h
blob: 344dfe4deffa437fb74c29de402efd7aac25ffba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifndef _mmu_405_h
#define _mmu_405_h

/* 
   Simple interface to the PowerPC 405 MMU
   
   The intention here is just to allow the MMU to be used to define cacheability and
   read/write/execute permissions in a simple enough way to fit entirely into the
   64-entry TLB cache.
   
   This code does not do address relocation and does not generate any MMU-related interrupts.
   
   The process ID support is there for a possible future extension where RTEMS supports
   setting the process ID on task switches, which allows per-process stack protection
    
   This code will call fatal_error() if your add_space() calls overrun the 64 entries

   Michael Hamel ADInstruments 2008

*/


#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"

enum {
	kAllProcessIDs = 0
};

typedef enum MMUAccessType {
	executable,
	readOnlyData,
	readOnlyNoCache,
	readWriteData,
	readWriteNoCache,
	readWriteExecutable
} MMUAccessType;

/* Initialise and clear the MMU */
void		mmu_initialise(void);

/* Turn on/off data access translation */
bool		mmu_enable_data(bool enable);

/* Turn on instruction translation */
bool		mmu_enable_code(bool enable);

/* Define properties for an area of memory (must be 1K-aligned) */
void		mmu_add_space(uint32_t startAddr, uint32_t endAddr, MMUAccessType permissions, uint8_t processID);

/* Delete a memory property definition */
void		mmu_remove_space(uint32_t startAddr, uint32_t endAddr);

/* Return number of TLB entries out of total in use */
int			mmu_get_tlb_count(void);

/* Allocate a new process ID and return it */
uint8_t		mmu_new_processID(void);

/* Free a process ID that has been in use */
void		mmu_free_processID(uint8_t freeThis);

/* Return the current process ID */
uint8_t		mmu_current_processID(void);

/* Change the process ID to ID and return the old value */
uint8_t		mmu_set_processID(uint8_t toID);


#ifdef __cplusplus
}
#endif

#endif //_mmu_405.h