src/memory.h

Mon, 06 Dec 2010 08:27:21 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Mon, 06 Dec 2010 08:27:21 +0000
changeset 76
2ef98ea1e944
parent 40
239bc48590ba
child 70
5bbe76e71698
permissions
-rw-r--r--

move edge-sensitive FDC IRQ to main()

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@40 26 #define WR32(array, address, andmask, value) { \
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@40 31 }
philpem@40 32
philpem@40 33 /// Array write, 16-bit
philpem@40 34 #define WR16(array, address, andmask, value) { \
philpem@40 35 array[(address + 0) & (andmask)] = (value >> 8) & 0xff; \
philpem@40 36 array[(address + 1) & (andmask)] = value & 0xff; \
philpem@40 37 }
philpem@40 38
philpem@40 39 /// Array write, 8-bit
philpem@40 40 #define WR8(array, address, andmask, value) \
philpem@40 41 array[(address + 0) & (andmask)] = value & 0xff;
philpem@40 42
philpem@40 43 /******************
philpem@40 44 * Memory mapping
philpem@40 45 ******************/
philpem@40 46
philpem@40 47 typedef enum {
philpem@40 48 MEM_ALLOWED = 0,
philpem@40 49 MEM_PAGEFAULT, // Page fault -- page not present
philpem@40 50 MEM_PAGE_NO_WE, // Page not write enabled
philpem@40 51 MEM_KERNEL, // User attempted to access kernel memory
philpem@40 52 MEM_UIE // User Nonmemory Location Access
philpem@40 53 } MEM_STATUS;
philpem@40 54
philpem@40 55 /**
philpem@40 56 * @brief Check memory access permissions for a given address.
philpem@40 57 * @param addr Address.
philpem@40 58 * @param writing true if writing to memory, false if reading.
philpem@40 59 * @return One of the MEM_STATUS constants, specifying whether the access is
philpem@40 60 * permitted, or what error occurred.
philpem@40 61 */
philpem@40 62 MEM_STATUS checkMemoryAccess(uint32_t addr, bool writing);
philpem@40 63
philpem@40 64 /**
philpem@40 65 * @brief Map a CPU memory address into physical memory space.
philpem@40 66 * @param addr Address.
philpem@40 67 * @param writing true if writing to memory, false if reading.
philpem@40 68 * @return Address, remapped into physical memory.
philpem@40 69 */
philpem@40 70 uint32_t mapAddr(uint32_t addr, bool writing);
philpem@40 71
philpem@40 72 #endif