aboutsummaryrefslogtreecommitdiff
path: root/include/kern/mpu/mpu_manager.h
blob: 5a0904c54661806f1307e77d44c212b484801e82 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef KERN_MPU_MPU_MANAGER_H_
#define KERN_MPU_MPU_MANAGER_H_

#include "kern/common.h"

typedef enum {
  REGION_SIZE_32 = 4,
  REGION_SIZE_64 = 5,
  REGION_SIZE_128 = 6,
  REGION_SIZE_256 = 7,
  REGION_SIZE_512 = 8,
  REGION_SIZE_1Kb = 9,
  REGION_SIZE_2Kb = 10,
  REGION_SIZE_4Kb = 11,
  REGION_SIZE_8Kb = 12,
  REGION_SIZE_16Kb = 13,
  REGION_SIZE_32Kb = 14,
  REGION_SIZE_64Kb = 15,
  REGION_SIZE_128Kb = 16,
  REGION_SIZE_256Kb = 17,
  REGION_SIZE_512Kb = 18,
  REGION_SIZE_1Mb = 19,
  REGION_SIZE_2Mb = 20,
  REGION_SIZE_4Mb = 21,
  REGION_SIZE_8Mb = 22,
  REGION_SIZE_16Mb = 23,
  REGION_SIZE_32Mb = 24,
  REGION_SIZE_64Mb = 25,
  REGION_SIZE_128Mb = 26,
  REGION_SIZE_256Mb = 27,
  REGION_SIZE_512Mb = 28,
  REGION_SIZE_1Gb = 29,
  REGION_SIZE_2Gb = 30,
  REGION_SIZE_4Gb = 31,
} region_size_t;

#define region_size_mask(region_size) ((1 << (region_size + 1)) - 1)

typedef enum {
  /* Neither Privileged nor non-Privileged code cannnot access this region */
  ACCESS_PERMS_NO_ACCESS = 0,

  /* Only privileged users can access this memory. */
  ACCESS_PERMS_ONLY_PRIV = 1,

  /* Privileged code can access fully, but non-privilege only has Read-only
     access.*/
  ACCESS_NON_PERMS_RO = 2,

  /* Both Privileged and non-Privileged code can access this region fully. */
  ACCESS_PERMS_FULL = 3,

  /* Only privileged users can access this memory, and only as Read-only. */
  ACCESS_PERMS_ONLY_PRIV_RO = 5,

  /* Both privileged and non-privileged users can access this memory, but only
     as Read-only.*/
  ACCESS_PERMS_BOTH_RO = 6,
} access_perms_t;

typedef struct {
  region_size_t size;
  uint8_t subregion_disable;

  struct {
    bool enable : 1;
    bool sharable : 1;
    bool cacheable : 1;
    bool bufferable : 1;
    bool executable : 1;
    uint8_t tex : 3;
  };

  access_perms_t perms;
  void* region;
} memory_region_opts_t;

void mpu_set_enabled(bool enabled);

/* Configures a memory region. The region number must be on the interval [0,8).
 */
void mpu_configure_region(int region_number, memory_region_opts_t* opts);

typedef enum {
  PRIVILEGED,
  NOT_PRIVILEGED,
} privilege_t;


/** Configure a peripheral region with default peripheral attributes. */
void configure_peripheral_region(
    void* peripheral_base,
    region_size_t region_size,
    privilege_t priv);

/** Configure a flash region with default flash attributes. */
void configure_flash_region(
    void* flash_base,
    region_size_t region_size,
    privilege_t priv);

/** Configure a ram region with default ram attributes. */
void configure_ram_region(
    void* ram_base,
    region_size_t region_size,
    privilege_t priv);

#endif /* KERN_MPU_MPU_MANAGER_H_ */