src/memory.h

Thu, 03 Mar 2011 13:05:21 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Thu, 03 Mar 2011 13:05:21 +0000
changeset 100
d6f699f89303
parent 70
5bbe76e71698
child 112
a392eb8f9806
permissions
-rw-r--r--

Fix broken pagebit update code (was failing S4TEST 19 Map Translation test)

philpem@40 1 #ifndef _MEMORY_H
philpem@40 2 #define _MEMORY_H
philpem@40 3
philpem@40 4 /***********************************
philpem@40 5 * Array read/write utility macros
philpem@40 6 * "Don't Repeat Yourself" :)
philpem@40 7 ***********************************/
philpem@40 8
philpem@40 9 /// Array read, 32-bit
philpem@40 10 #define RD32(array, address, andmask) \
philpem@40 11 (((uint32_t)array[(address + 0) & (andmask)] << 24) | \
philpem@40 12 ((uint32_t)array[(address + 1) & (andmask)] << 16) | \
philpem@40 13 ((uint32_t)array[(address + 2) & (andmask)] << 8) | \
philpem@40 14 ((uint32_t)array[(address + 3) & (andmask)]))
philpem@40 15
philpem@40 16 /// Array read, 16-bit
philpem@40 17 #define RD16(array, address, andmask) \
philpem@40 18 (((uint32_t)array[(address + 0) & (andmask)] << 8) | \
philpem@40 19 ((uint32_t)array[(address + 1) & (andmask)]))
philpem@40 20
philpem@40 21 /// Array read, 8-bit
philpem@40 22 #define RD8(array, address, andmask) \
philpem@40 23 ((uint32_t)array[(address + 0) & (andmask)])
philpem@40 24
philpem@40 25 /// Array write, 32-bit
philpem@70 26 #define WR32(array, address, andmask, value) do { \
philpem@40 27 array[(address + 0) & (andmask)] = (value >> 24) & 0xff; \
philpem@40 28 array[(address + 1) & (andmask)] = (value >> 16) & 0xff; \
philpem@40 29 array[(address + 2) & (andmask)] = (value >> 8) & 0xff; \
philpem@40 30 array[(address + 3) & (andmask)] = value & 0xff; \
philpem@70 31 } while (0)
philpem@40 32
philpem@40 33 /// Array write, 16-bit
philpem@70 34 #define WR16(array, address, andmask, value) do { \
philpem@40 35 array[(address + 0) & (andmask)] = (value >> 8) & 0xff; \
philpem@40 36 array[(address + 1) & (andmask)] = value & 0xff; \
philpem@70 37 } while (0)
philpem@40 38
philpem@40 39 /// Array write, 8-bit
philpem@70 40 #define WR8(array, address, andmask, value) do { \
philpem@70 41 array[(address + 0) & (andmask)] = value & 0xff; \
philpem@70 42 } while (0)
philpem@40 43
philpem@40 44 /******************
philpem@40 45 * Memory mapping
philpem@40 46 ******************/
philpem@40 47
philpem@40 48 typedef enum {
philpem@40 49 MEM_ALLOWED = 0,
philpem@40 50 MEM_PAGEFAULT, // Page fault -- page not present
philpem@40 51 MEM_PAGE_NO_WE, // Page not write enabled
philpem@40 52 MEM_KERNEL, // User attempted to access kernel memory
philpem@40 53 MEM_UIE // User Nonmemory Location Access
philpem@40 54 } MEM_STATUS;
philpem@40 55
philpem@40 56 /**
philpem@40 57 * @brief Check memory access permissions for a given address.
philpem@40 58 * @param addr Address.
philpem@40 59 * @param writing true if writing to memory, false if reading.
philpem@40 60 * @return One of the MEM_STATUS constants, specifying whether the access is
philpem@40 61 * permitted, or what error occurred.
philpem@40 62 */
philpem@40 63 MEM_STATUS checkMemoryAccess(uint32_t addr, bool writing);
philpem@40 64
philpem@40 65 /**
philpem@40 66 * @brief Map a CPU memory address into physical memory space.
philpem@40 67 * @param addr Address.
philpem@40 68 * @param writing true if writing to memory, false if reading.
philpem@40 69 * @return Address, remapped into physical memory.
philpem@40 70 */
philpem@40 71 uint32_t mapAddr(uint32_t addr, bool writing);
philpem@40 72
philpem@40 73 #endif