#include <metal/pmp.h>
#include <metal/cpu.h>
-#define CONFIG_TO_INT(_config) (*((size_t *) &(_config)))
-#define INT_TO_CONFIG(_int) (*((struct metal_pmp_config *) &(_int)))
+#define CONFIG_TO_INT(_config) (*((char *) &(_config)))
+#define INT_TO_CONFIG(_int) (*((struct metal_pmp_config *)(char *) &(_int)))
struct metal_pmp *metal_pmp_get_device(void)
{
return (1 << (index + 3));
}
-/* Get the number of pmp regions for the current hart */
-static int _pmp_regions() {
- struct metal_cpu *current_cpu = metal_cpu_get(metal_cpu_get_current_hartid());
+/* Get the number of pmp regions for the given hart */
+int metal_pmp_num_regions(int hartid)
+{
+ struct metal_cpu *cpu = metal_cpu_get(hartid);
- return __metal_driver_cpu_num_pmp_regions(current_cpu);
+ return __metal_driver_cpu_num_pmp_regions(cpu);
}
+/* Get the number of pmp regions for the current hart */
+static unsigned int _pmp_regions() {
+ return metal_pmp_num_regions(metal_cpu_get_current_hartid());
+}
void metal_pmp_init(struct metal_pmp *pmp) {
if(!pmp) {
if(old_address != address) {
switch(region) {
case 0:
- asm("csrw pmpaddr0, %[addr]"
+ __asm__("csrw pmpaddr0, %[addr]"
:: [addr] "r" (address) :);
break;
case 1:
- asm("csrw pmpaddr1, %[addr]"
+ __asm__("csrw pmpaddr1, %[addr]"
:: [addr] "r" (address) :);
break;
case 2:
- asm("csrw pmpaddr2, %[addr]"
+ __asm__("csrw pmpaddr2, %[addr]"
:: [addr] "r" (address) :);
break;
case 3:
- asm("csrw pmpaddr3, %[addr]"
+ __asm__("csrw pmpaddr3, %[addr]"
:: [addr] "r" (address) :);
break;
case 4:
- asm("csrw pmpaddr4, %[addr]"
+ __asm__("csrw pmpaddr4, %[addr]"
:: [addr] "r" (address) :);
break;
case 5:
- asm("csrw pmpaddr5, %[addr]"
+ __asm__("csrw pmpaddr5, %[addr]"
:: [addr] "r" (address) :);
break;
case 6:
- asm("csrw pmpaddr6, %[addr]"
+ __asm__("csrw pmpaddr6, %[addr]"
:: [addr] "r" (address) :);
break;
case 7:
- asm("csrw pmpaddr7, %[addr]"
+ __asm__("csrw pmpaddr7, %[addr]"
:: [addr] "r" (address) :);
break;
case 8:
- asm("csrw pmpaddr8, %[addr]"
+ __asm__("csrw pmpaddr8, %[addr]"
:: [addr] "r" (address) :);
break;
case 9:
- asm("csrw pmpaddr9, %[addr]"
+ __asm__("csrw pmpaddr9, %[addr]"
:: [addr] "r" (address) :);
break;
case 10:
- asm("csrw pmpaddr10, %[addr]"
+ __asm__("csrw pmpaddr10, %[addr]"
:: [addr] "r" (address) :);
break;
case 11:
- asm("csrw pmpaddr11, %[addr]"
+ __asm__("csrw pmpaddr11, %[addr]"
:: [addr] "r" (address) :);
break;
case 12:
- asm("csrw pmpaddr12, %[addr]"
+ __asm__("csrw pmpaddr12, %[addr]"
:: [addr] "r" (address) :);
break;
case 13:
- asm("csrw pmpaddr13, %[addr]"
+ __asm__("csrw pmpaddr13, %[addr]"
:: [addr] "r" (address) :);
break;
case 14:
- asm("csrw pmpaddr14, %[addr]"
+ __asm__("csrw pmpaddr14, %[addr]"
:: [addr] "r" (address) :);
break;
case 15:
- asm("csrw pmpaddr15, %[addr]"
+ __asm__("csrw pmpaddr15, %[addr]"
:: [addr] "r" (address) :);
break;
}
switch(region / 4) {
case 0:
- asm("csrc pmpcfg0, %[mask]"
+ __asm__("csrc pmpcfg0, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg0, %[cfg]"
+ __asm__("csrs pmpcfg0, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
case 1:
- asm("csrc pmpcfg1, %[mask]"
+ __asm__("csrc pmpcfg1, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg1, %[cfg]"
+ __asm__("csrs pmpcfg1, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
case 2:
- asm("csrc pmpcfg2, %[mask]"
+ __asm__("csrc pmpcfg2, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg2, %[cfg]"
+ __asm__("csrs pmpcfg2, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
case 3:
- asm("csrc pmpcfg3, %[mask]"
+ __asm__("csrc pmpcfg3, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg3, %[cfg]"
+ __asm__("csrs pmpcfg3, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
}
switch(region / 8) {
case 0:
- asm("csrc pmpcfg0, %[mask]"
+ __asm__("csrc pmpcfg0, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg0, %[cfg]"
+ __asm__("csrs pmpcfg0, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
case 1:
- asm("csrc pmpcfg2, %[mask]"
+ __asm__("csrc pmpcfg2, %[mask]"
:: [mask] "r" (cfgmask) :);
- asm("csrs pmpcfg2, %[cfg]"
+ __asm__("csrs pmpcfg2, %[cfg]"
:: [cfg] "r" (pmpcfg) :);
break;
}
size_t *address)
{
size_t pmpcfg = 0;
+ char *pmpcfg_convert = (char *)&pmpcfg;
if(!pmp || !config || !address) {
/* NULL pointers are invalid arguments */
#if __riscv_xlen==32
switch(region / 4) {
case 0:
- asm("csrr %[cfg], pmpcfg0"
+ __asm__("csrr %[cfg], pmpcfg0"
: [cfg] "=r" (pmpcfg) ::);
break;
case 1:
- asm("csrr %[cfg], pmpcfg1"
+ __asm__("csrr %[cfg], pmpcfg1"
: [cfg] "=r" (pmpcfg) ::);
break;
case 2:
- asm("csrr %[cfg], pmpcfg2"
+ __asm__("csrr %[cfg], pmpcfg2"
: [cfg] "=r" (pmpcfg) ::);
break;
case 3:
- asm("csrr %[cfg], pmpcfg3"
+ __asm__("csrr %[cfg], pmpcfg3"
: [cfg] "=r" (pmpcfg) ::);
break;
}
#elif __riscv_xlen==64
switch(region / 8) {
case 0:
- asm("csrr %[cfg], pmpcfg0"
+ __asm__("csrr %[cfg], pmpcfg0"
: [cfg] "=r" (pmpcfg) ::);
break;
case 1:
- asm("csrr %[cfg], pmpcfg2"
+ __asm__("csrr %[cfg], pmpcfg2"
: [cfg] "=r" (pmpcfg) ::);
break;
}
#error XLEN is not set to supported value for PMP driver
#endif
- *config = INT_TO_CONFIG(pmpcfg);
+ *config = INT_TO_CONFIG(*pmpcfg_convert);
switch(region) {
case 0:
- asm("csrr %[addr], pmpaddr0"
+ __asm__("csrr %[addr], pmpaddr0"
: [addr] "=r" (*address) ::);
break;
case 1:
- asm("csrr %[addr], pmpaddr1"
+ __asm__("csrr %[addr], pmpaddr1"
: [addr] "=r" (*address) ::);
break;
case 2:
- asm("csrr %[addr], pmpaddr2"
+ __asm__("csrr %[addr], pmpaddr2"
: [addr] "=r" (*address) ::);
break;
case 3:
- asm("csrr %[addr], pmpaddr3"
+ __asm__("csrr %[addr], pmpaddr3"
: [addr] "=r" (*address) ::);
break;
case 4:
- asm("csrr %[addr], pmpaddr4"
+ __asm__("csrr %[addr], pmpaddr4"
: [addr] "=r" (*address) ::);
break;
case 5:
- asm("csrr %[addr], pmpaddr5"
+ __asm__("csrr %[addr], pmpaddr5"
: [addr] "=r" (*address) ::);
break;
case 6:
- asm("csrr %[addr], pmpaddr6"
+ __asm__("csrr %[addr], pmpaddr6"
: [addr] "=r" (*address) ::);
break;
case 7:
- asm("csrr %[addr], pmpaddr7"
+ __asm__("csrr %[addr], pmpaddr7"
: [addr] "=r" (*address) ::);
break;
case 8:
- asm("csrr %[addr], pmpaddr8"
+ __asm__("csrr %[addr], pmpaddr8"
: [addr] "=r" (*address) ::);
break;
case 9:
- asm("csrr %[addr], pmpaddr9"
+ __asm__("csrr %[addr], pmpaddr9"
: [addr] "=r" (*address) ::);
break;
case 10:
- asm("csrr %[addr], pmpaddr10"
+ __asm__("csrr %[addr], pmpaddr10"
: [addr] "=r" (*address) ::);
break;
case 11:
- asm("csrr %[addr], pmpaddr11"
+ __asm__("csrr %[addr], pmpaddr11"
: [addr] "=r" (*address) ::);
break;
case 12:
- asm("csrr %[addr], pmpaddr12"
+ __asm__("csrr %[addr], pmpaddr12"
: [addr] "=r" (*address) ::);
break;
case 13:
- asm("csrr %[addr], pmpaddr13"
+ __asm__("csrr %[addr], pmpaddr13"
: [addr] "=r" (*address) ::);
break;
case 14:
- asm("csrr %[addr], pmpaddr14"
+ __asm__("csrr %[addr], pmpaddr14"
: [addr] "=r" (*address) ::);
break;
case 15:
- asm("csrr %[addr], pmpaddr15"
+ __asm__("csrr %[addr], pmpaddr15"
: [addr] "=r" (*address) ::);
break;
}