diff packages/cygmon/current/misc/arm/cpu.h @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children e0c0827131d1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/cygmon/current/misc/arm/cpu.h
@@ -0,0 +1,969 @@
+#ifndef __ARM_CPU_H__
+#define __ARM_CPU_H__
+//==========================================================================
+//
+//      cpu.h
+//
+//      ARM specific processor defines
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    
+// Contributors: gthomas
+// Date:         1999-10-20
+// Purpose:      ARM specific processor defines 
+// Description:  ARM is a Registered Trademark of Advanced RISC Machines
+//               Limited.
+//               Other Brands and Trademarks are the property of their
+//               respective owners.               
+//
+//####DESCRIPTIONEND####
+//
+//=========================================================================
+
+#include <bsp/bsp.h>
+#include <bsp/defs.h>
+#ifdef __ECOS__
+#include <cyg/hal/hal_arch.h>
+#endif
+
+/*
+ * Only define __NEED_UNDERSCORE__ for arm-coff targets
+ */
+#if !defined(__ELF__)
+#  define __NEED_UNDERSCORE__
+#endif
+
+/*
+ * Macros to glue together two tokens.
+ */
+#  ifdef __STDC__
+#    define XGLUE(a,b) a##b
+#  else
+#    define XGLUE(a,b) a/**/b
+#  endif
+
+#  define GLUE(a,b) XGLUE(a,b)
+
+/*
+ * Symbol Names with leading underscore if necessary
+ */
+#  ifdef __NEED_UNDERSCORE__
+#    define SYM_NAME(name) GLUE(_,name)
+#  else
+#    define SYM_NAME(name) name
+#  endif /* __NEED_UNDERSCORE__ */
+
+/*
+ * Various macros to better handle assembler/object format differences
+ */
+#if defined(__ASSEMBLER__)
+
+/*
+ * Assembly function start definition
+ */
+#ifdef __NEED_UNDERSCORE__
+.macro FUNC_START name
+	.global _\name
+	.align  4
+    _\name:
+.endm
+#else
+.macro FUNC_START name
+	.global \name
+	.align  4
+    \name:
+.endm
+#endif
+
+/*
+ * Assembly function end definition
+ */
+#ifdef __NEED_UNDERSCORE__
+.macro FUNC_END name
+.endm
+#else
+.macro FUNC_END name
+.endm
+#endif
+
+/*
+ * Register Prefix
+ */
+#  ifndef __REGISTER_PREFIX__
+#    define __REGISTER_PREFIX__
+#  endif /* __REGISTER_PREFIX__ */
+
+/*
+ * Immediate Prefix
+ */
+#  ifndef __IMM_PREFIX__
+#    define __IMM_PREFIX__ #
+#  endif /* __IMM_PREFIX__ */
+
+/*
+ * use the right prefix for registers.
+ */
+#  define REG(x) GLUE(__REGISTER_PREFIX__,x)
+
+/*
+ * use the right prefix for immediate values.
+ */
+#  define IMM(x) GLUE(__IMM_PREFIX__,x)
+
+#endif /* defined(__ASSEMBLER__) */
+
+
+/*
+ * Setup register defines and such
+ */
+#if defined(__ASSEMBLER__)
+
+#  define r0   REG (r0)
+#  define r1   REG (r1)
+#  define r2   REG (r2)
+#  define r3   REG (r3)
+
+#  define r4   REG (r4)
+#  define r5   REG (r5)
+#  define r6   REG (r6)
+#  define r7   REG (r7)
+#  define r8   REG (r8)
+#  define r9   REG (r9)
+#  define r10  REG (r10)
+#  define r11  REG (r11)
+#  define r12  REG (r12)
+#  define r13  REG (r13)
+#  define sp   REG (sp)
+#  define r14  REG (r14)
+#  define lr   REG (lr)
+#  define pc   REG (pc)
+
+#  define f0   REG (f0)
+#  define f1   REG (f1)
+#  define f2   REG (f2)
+#  define f3   REG (f3)
+#  define f4   REG (f4)
+#  define f5   REG (f5)
+#  define f6   REG (f6)
+#  define f7   REG (f7)
+#  define fps  REG (fps)
+
+#  define cpsr REG (cpsr)
+#  define spsr REG (spsr)
+
+/*
+ * Register offset definitions
+ * These numbers are offsets into the ex_regs_t struct.
+ */
+#  define r0_o   0
+#  define r1_o   4
+#  define r2_o   8
+#  define r3_o   12
+#  define r4_o   16
+#  define r5_o   20
+#  define r6_o   24
+#  define r7_o   28
+#  define r8_o   32
+#  define r9_o   36
+#  define r10_o  40
+#  define r11_o  44
+#  define r12_o  48
+#  define r13_o  52
+#  define sp_o   r13_o
+#  define r14_o  56
+#  define lr_o   r14_o
+#  define pc_o   60
+
+#  define f0_o   64
+#  define f1_o   76
+#  define f2_o   88
+#  define f3_o   100
+#  define f4_o   112
+#  define f5_o   124
+#  define f6_o   136
+#  define f7_o   148
+#  define fps_o  160
+
+#  define cpsr_o 164
+#  define spsvc_o 168
+#  define ARM_EX_REGS_T_SIZE 172
+
+#else /* !defined(__ASSEMBLER__) */
+
+  /*
+   * Register name that is used in help strings and such
+   */
+# define REGNAME_EXAMPLE "r0"
+
+  /*
+   *  Register numbers. These are assumed to match the
+   *  register numbers used by GDB.
+   */
+  enum __regnames {
+      REG_R0,
+      REG_R1,
+      REG_R2,
+      REG_R3,
+      REG_R4,
+      REG_R5,
+      REG_R6,
+      REG_R7,
+      REG_R8,
+      REG_R9,
+      REG_R10,
+      REG_R11,
+      REG_R12,
+      REG_R13,
+      REG_SP=REG_R13,
+      REG_R14,
+      REG_LR=REG_R14,
+      REG_PC,
+
+      REG_F0,
+      REG_F1,
+      REG_F2,
+      REG_F3,
+      REG_F4,
+      REG_F5,
+      REG_F6,
+      REG_F7,
+      REG_FPS,
+
+      REG_CPSR,
+      REG_SPSVC,
+      REG_MAX=REG_SPSVC
+  };
+
+  /*
+   * 12-byte struct for storing Floating point registers
+   */
+  typedef struct
+  {
+      unsigned long high;
+      unsigned long middle;
+      unsigned long low;
+  } fp_reg;
+
+  /*
+   *  How registers are stored for exceptions.
+   */
+#ifdef __ECOS__
+#define ex_regs_t HAL_SavedRegisters
+#define _r0       d[0]
+#define _r1       d[1]
+#define _r2       d[2]
+#define _r3       d[3]
+#define _r4       d[4]
+#define _r5       d[5]
+#define _r6       d[6]
+#define _r7       d[7]
+#define _r8       d[8]
+#define _r9       d[9]
+#define _r10      d[10]
+#define _r11      fp
+#define _r12      ip
+#define _r13      sp
+#define _r14      lr
+#define _pc       pc
+#define _cpsr     cpsr
+#define _spsvc    msr
+#else
+  typedef struct
+  {
+    unsigned long _r0;
+    unsigned long _r1;
+    unsigned long _r2;
+    unsigned long _r3;
+    unsigned long _r4;
+    unsigned long _r5;
+    unsigned long _r6;
+    unsigned long _r7;
+    unsigned long _r8;
+    unsigned long _r9;
+    unsigned long _r10;
+    unsigned long _r11;
+    unsigned long _r12;
+    unsigned long _r13;
+    unsigned long _r14;
+    unsigned long _pc;
+
+    fp_reg        _f0;
+    fp_reg        _f1;
+    fp_reg        _f2;
+    fp_reg        _f3;
+    fp_reg        _f4;
+    fp_reg        _f5;
+    fp_reg        _f6;
+    fp_reg        _f7;
+    unsigned long _fps;
+    unsigned long _cpsr;
+
+    unsigned long _spsvc;  /* saved svc mode sp */
+
+  } ex_regs_t;
+#endif
+#   define   _sp  _r13
+#   define   _lr  _r14
+
+extern void __icache_flush(void *addr, int nbytes);
+extern void __dcache_flush(void *addr, int nbytes);
+
+#endif /* __ASSEMBLER__ */
+
+
+/*
+ * Program Status Register Definitions
+ */
+#if defined(__ASSEMBLER__)
+#  define ARM_PSR_NEGATIVE       0x80000000  /* Negative Bit                           */
+#  define ARM_PSR_ZERO           0x40000000  /* Zero Bit                               */
+#  define ARM_PSR_CARRY          0x20000000  /* Carry Bit                              */
+#  define ARM_PSR_OVERFLOW       0x10000000  /* Overflow Bit                           */
+#  define ARM_PSR_IRQ            0x00000080  /* IRQ Bit                                */
+#  define ARM_PSR_FIQ            0x00000040  /* FIQ Bit                                */
+#  define ARM_PSR_THUMB_STATE    0x00000020  /* Thumb/ARM(R) Execution                 */
+#  define ARM_PSR_MODE_MASK      0x0000001F  /* ARM(R) Processor Mode Mask             */
+#else /* ! defined(__ASSEMBLER__) */
+  struct psr_struct {
+      unsigned mode      : 5;
+      unsigned t_bit     : 1;
+      unsigned f_bit     : 1;
+      unsigned i_bit     : 1;
+      unsigned rsv1      : 20;  /* == 0x00000 */
+      unsigned v_bit     : 1;
+      unsigned c_bit     : 1;
+      unsigned z_bit     : 1;
+      unsigned n_bit     : 1;
+  };
+
+  union arm_psr {
+      unsigned long word;
+      struct psr_struct psr;
+  };
+#endif /* __ASSEMBLER__ */
+
+/*
+ * PSR Mode values
+ */
+#define ARM_PSR_MODE_USER      0x00000010  /* User mode                              */
+#define ARM_PSR_MODE_FIQ       0x00000011  /* FIQ mode                               */
+#define ARM_PSR_MODE_IRQ       0x00000012  /* IRQ mode                               */
+#define ARM_PSR_MODE_SVC       0x00000013  /* SVC mode                               */
+#define ARM_PSR_MODE_ABORT     0x00000017  /* ABORT mode                             */
+#define ARM_PSR_MODE_UNDEF     0x0000001B  /* UNDEF mode                             */
+#define ARM_PSR_MODE_SYSTEM    0x0000001F  /* System Mode                            */
+#define ARM_PSR_NUM_MODES      7
+
+/*
+ * Core Exception vectors.
+ */
+#define BSP_CORE_EXC_RESET                     0
+#define BSP_CORE_EXC_UNDEFINED_INSTRUCTION     1
+#define BSP_CORE_EXC_SOFTWARE_INTERRUPT        2
+#define BSP_CORE_EXC_PREFETCH_ABORT            3
+#define BSP_CORE_EXC_DATA_ABORT                4
+#define BSP_CORE_EXC_ADDRESS_ERROR_26_BIT      5
+#define BSP_CORE_EXC_IRQ                       6
+#define BSP_CORE_EXC_FIQ                       7
+#define BSP_MAX_EXCEPTIONS                     8
+#define BSP_CORE_EXC(vec_num)                  (unsigned long*)(vec_num << 2)
+
+#define BREAKPOINT_INSN                        0xE7FFDEFE   /* Illegal inst opcode */
+#define SYSCALL_SWI                            0x00180001
+
+#if defined(__ASSEMBLER__)
+  .macro BREAKPOINT
+         .word BREAKPOINT_INSN
+  .endm
+  .macro SYSCALL
+         swi  IMM(SYSCALL_SWI)
+  .endm
+  .macro __CLI
+         stmfd  sp!, {r0}
+         mrs    r0, cpsr
+         bic    r0, r0, IMM(ARM_PSR_IRQ | ARM_PSR_FIQ)
+         msr    cpsr, r0
+         ldmfd  sp!, {r0}
+  .endm
+  .macro __STI
+         stmfd  sp!, {r0}
+         mrs    r0, cpsr
+         orr    r0, r0, IMM(ARM_PSR_IRQ | ARM_PSR_FIQ)
+         msr    cpsr, r0
+         ldmfd  sp!, {r0}
+  .endm
+
+#  if 0
+  /*
+   * Use this code to verify a particular processing mode
+   */
+	mrs	r0, cpsr
+        and     r0, r0, IMM(ARM_PSR_MODE_MASK)
+        ldr     r1, =ARM_PSR_MODE_IRQ
+        cmps    r0, r1
+0:      bne     0b
+        PORT_TOGGLE_DEBUG
+#  endif /* 0 */
+
+#else /* !defined(__ASSEMBLER__) */
+
+#  define BREAKPOINT() asm volatile(" .word 0xE7FFDEFE")
+#  define SYSCALL()    asm volatile(" swi   %0" : /* No outputs */ : "i" (SYSCALL_SWI))
+#  define __cli()      asm volatile("
+         stmfd  sp!, {r0}
+         mrs    r0, cpsr
+         bic    r0, r0, #0x000000C0
+         msr    cpsr, r0
+         ldmfd  sp!, {r0}")
+#  define __sti()      asm volatile("
+         stmfd  sp!, {r0}
+         mrs    r0, cpsr
+         orr    r0, r0, #0x000000C0
+         msr    cpsr, r0
+         ldmfd  sp!, {r0}")
+#  define __mcr(cp_num, opcode1, Rd, CRn, CRm, opcode2) \
+     asm volatile (" mcr " cp_num  ", " \
+                           opcode1 ", " \
+                           "%0"    ", " \
+                           CRn     ", " \
+                           CRm     ", " \
+                           opcode2 : /* no outputs */ : "r" (Rd))
+#  define __mrc(cp_num, opcode1, Rd, CRn, CRm, opcode2) \
+     asm volatile (" mrc " cp_num  ", " \
+                           opcode1 ", " \
+                           "%0"    ", " \
+                           CRn     ", " \
+                           CRm     ", " \
+                           opcode2 : "=r" (Rd) : /* no inputs */)
+
+  static inline unsigned __get_cpsr(void)
+  {
+      unsigned long retval;
+      asm volatile (" mrs  %0, cpsr" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_cpsr(unsigned val)
+  {
+      asm volatile (" msr  cpsr, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_spsr(void)
+  {
+      unsigned long retval;
+      asm volatile (" mrs  %0, spsr" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_spsr(unsigned val)
+  {
+      asm volatile (" msr  spsr, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_sp(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, sp" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_sp(unsigned val)
+  {
+      asm volatile (" mov  sp, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_fp(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, fp" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_fp(unsigned val)
+  {
+      asm volatile (" mov  fp, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_pc(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, pc" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_pc(unsigned val)
+  {
+      asm volatile (" mov  pc, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_lr(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, lr" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_lr(unsigned val)
+  {
+      asm volatile (" mov  lr, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_r8(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, r8" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_r8(unsigned val)
+  {
+      asm volatile (" mov  r8, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_r9(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, r9" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_r9(unsigned val)
+  {
+      asm volatile (" mov  r9, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_r10(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, r10" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_r10(unsigned val)
+  {
+      asm volatile (" mov  r10, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_r11(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, r11" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_r11(unsigned val)
+  {
+      asm volatile (" mov  r11, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+  static inline unsigned __get_r12(void)
+  {
+      unsigned long retval;
+      asm volatile (" mov  %0, r12" : "=r" (retval) : /* no inputs */  );
+      return retval;
+  }
+
+  static inline void __set_r12(unsigned val)
+  {
+      asm volatile (" mov  r12, %0" : /* no outputs */ : "r" (val)  );
+  }
+
+#endif /* defined(__ASSEMBLER__) */
+
+#define GDB_BREAKPOINT_VECTOR BSP_CORE_EXC_UNDEFINED_INSTRUCTION
+#define GDB_SYSCALL_VECTOR    BSP_CORE_EXC_SOFTWARE_INTERRUPT
+
+#define ARM_INST_SIZE            sizeof(unsigned long)
+#define GDB_BREAKPOINT_INST_SIZE ARM_INST_SIZE
+
+#ifdef __CPU_LH77790A__
+#  include <bsp/lh77790a.h>
+#endif /* __CPU_LH77790A__ */
+
+#if !defined(__ASSEMBLER__)
+/*
+ * Define the CPU specific data
+ */
+#ifdef __CPU_LH77790A__
+  typedef struct {
+      unsigned char lh77790a_port_control_shadow;
+  } arm_cpu_data;
+#endif /* __CPU_LH77790A__ */
+#endif /* !defined(__ASSEMBLER__) */
+
+#ifdef __CPU_SA110__
+#include <bsp/sa-110.h>
+#endif /* __CPU_SA110__ */
+
+#ifdef __CPU_SA1100__
+#include <bsp/sa-1100.h>
+#endif /* __CPU_SA110__ */
+
+#ifdef __CPU_710T__
+#include <bsp/arm710t.h>
+#endif /* __CPU_710T__ */
+
+#ifdef MMU
+/*
+ * ARM(R) MMU Definitions
+ */
+
+#ifndef __ASSEMBLER__
+extern void *page1;
+#endif /* __ASSEMBLER__ */
+
+/*
+ * ARM(R) Cache and MMU Control Registers
+ *
+ * Accessed through coprocessor instructions.
+ */
+#ifdef __ASSEMBLER__
+#  define ARM_CACHE_COPROCESSOR_NUM             p15
+#  define ARM_COPROCESSOR_OPCODE_DONT_CARE      0x0
+#  define ARM_COPROCESSOR_RM_DONT_CARE          c0
+#else /* __ASSEMBLER__ */
+#  define ARM_CACHE_COPROCESSOR_NUM             "p15"
+#  define ARM_COPROCESSOR_OPCODE_DONT_CARE      "0x0"
+#  define ARM_COPROCESSOR_RM_DONT_CARE          "c0"
+#endif /* __ASSEMBLER__ */
+
+#ifdef __ASSEMBLER__
+#  define ARM_ID_REGISTER                        c0
+#  define ARM_CONTROL_REGISTER                   c1
+#  define ARM_TRANSLATION_TABLE_BASE_REGISTER    c2
+#  define ARM_DOMAIN_ACCESS_CONTROL_REGISTER     c3
+#  define ARM_FAULT_STATUS_REGISTER              c5
+#  define ARM_FAULT_ADDRESS_REGISTER             c6
+#  define ARM_CACHE_OPERATIONS_REGISTER          c7
+#  define ARM_TLB_OPERATIONS_REGISTER            c8
+#  define ARM_READ_BUFFER_OPERATIONS_REGISTER    c9
+#else /* __ASSEMBLER__ */
+#  define ARM_ID_REGISTER                        "c0"
+#  define ARM_CONTROL_REGISTER                   "c1"
+#  define ARM_TRANSLATION_TABLE_BASE_REGISTER    "c2"
+#  define ARM_DOMAIN_ACCESS_CONTROL_REGISTER     "c3"
+#  define ARM_FAULT_STATUS_REGISTER              "c5"
+#  define ARM_FAULT_ADDRESS_REGISTER             "c6"
+#  define ARM_CACHE_OPERATIONS_REGISTER          "c7"
+#  define ARM_TLB_OPERATIONS_REGISTER            "c8"
+#  define ARM_READ_BUFFER_OPERATIONS_REGISTER    "c9"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * SA-1100 Cache and MMU ID Register value
+ */
+#define ARM_ID_MASK                              0xFFFFFFF0
+#define ARM_ID_VALUE                             0x4401a110
+
+/*
+ * SA-1100 Cache Control Register Bit Fields and Masks
+ */
+#define ARM_MMU_DISABLED                         0x00000000
+#define ARM_MMU_ENABLED                          0x00000001
+#define ARM_MMU_MASK                             0x00000001
+#define ARM_ADDRESS_FAULT_DISABLED               0x00000000
+#define ARM_ADDRESS_FAULT_ENABLED                0x00000002
+#define ARM_ADDRESS_FAULT_MASK                   0x00000002
+#define ARM_DATA_CACHE_DISABLED                  0x00000000
+#define ARM_DATA_CACHE_ENABLED                   0x00000004
+#define ARM_DATA_CACHE_MASK                      0x00000004
+#define ARM_WRITE_BUFFER_DISABLED                0x00000000
+#define ARM_WRITE_BUFFER_ENABLED                 0x00000008
+#define ARM_WRITE_BUFFER_MASK                    0x00000008
+#define ARM_LITTLE_ENDIAN                        0x00000000
+#define ARM_BIG_ENDIAN                           0x00000080
+#define ARM_ACCESS_CHECKS_NONE                   0x00000000
+#define ARM_ACCESS_CHECKS_SYSTEM                 0x00000100
+#define ARM_ACCESS_CHECKS_ROM                    0x00000200
+#define ARM_INSTRUCTION_CACHE_DISABLED           0x00000000
+#define ARM_INSTRUCTION_CACHE_ENABLED            0x00001000
+#define ARM_INSTRUCTION_CACHE_MASK               0x00001000
+#define ARM_VIRTUAL_IVR_BASE_00000000            0x00000000
+#define ARM_VIRTUAL_IVR_BASE_FFFF0000            0x00002000
+#define ARM_CONTROL_SBZ_MASK                     0x00001FFF
+
+/*
+ * SA-1100 Translation Table Base Bit Masks
+ */
+#define ARM_TRANSLATION_TABLE_MASK               0xFFFFC000
+
+/*
+ * SA-1100 Domain Access Control Bit Masks
+ */
+#define ARM_DOMAIN_0_MASK                        0x00000003
+#define ARM_DOMAIN_1_MASK                        0x0000000C
+#define ARM_DOMAIN_2_MASK                        0x00000030
+#define ARM_DOMAIN_3_MASK                        0x000000C0
+#define ARM_DOMAIN_4_MASK                        0x00000300
+#define ARM_DOMAIN_5_MASK                        0x00000C00
+#define ARM_DOMAIN_6_MASK                        0x00003000
+#define ARM_DOMAIN_7_MASK                        0x0000C000
+#define ARM_DOMAIN_8_MASK                        0x00030000
+#define ARM_DOMAIN_9_MASK                        0x000C0000
+#define ARM_DOMAIN_10_MASK                       0x00300000
+#define ARM_DOMAIN_11_MASK                       0x00C00000
+#define ARM_DOMAIN_12_MASK                       0x03000000
+#define ARM_DOMAIN_13_MASK                       0x0C000000
+#define ARM_DOMAIN_14_MASK                       0x30000000
+#define ARM_DOMAIN_15_MASK                       0xC0000000
+
+#define ARM_ACCESS_TYPE_NO_ACCESS(domain_num)    (0x0 << (domain_num))
+#define ARM_ACCESS_TYPE_CLIENT(domain_num)       (0x1 << (domain_num))
+#define ARM_ACCESS_TYPE_MANAGER(domain_num)      (0x3 << (domain_num))
+
+/*
+ * SA-1100 Fault Status Bit Masks
+ */
+#define ARM_FAULT_STATUS_MASK                    0x0000000F
+#define ARM_DOMAIN_MASK                          0x000000F0
+#define ARM_DATA_BREAKPOINT_MASK                 0x00000200
+
+/*
+ * SA-1100 Cache Control Operations Definitions
+ */
+#ifdef __ASSEMBLER__
+#  define ARM_FLUSH_CACHE_INST_DATA_OPCODE       0x0
+#  define ARM_FLUSH_CACHE_INST_DATA_RM           c7
+#  define ARM_FLUSH_CACHE_INST_OPCODE            0x0
+#  define ARM_FLUSH_CACHE_INST_RM                c5
+#  define ARM_FLUSH_CACHE_DATA_OPCODE            0x0
+#  define ARM_FLUSH_CACHE_DATA_RM                c6
+#  define ARM_FLUSH_CACHE_DATA_SINGLE_OPCODE     0x1
+#  define ARM_FLUSH_CACHE_DATA_SINGLE_RM         c6
+#  define ARM_CLEAN_CACHE_DATA_ENTRY_OPCODE      0x1
+#  define ARM_CLEAN_CACHE_DATA_ENTRY_RM          c10
+#  define ARM_DRAIN_CACHE_WRITE_BUFFER_OPCODE    0x4
+#  define ARM_DRAIN_CACHE_WRITE_BUFFER_RM        c10
+#else /* __ASSEMBLER__ */                        
+#  define ARM_FLUSH_CACHE_INST_DATA_OPCODE       "0x0"
+#  define ARM_FLUSH_CACHE_INST_DATA_RM           "c7"
+#  define ARM_FLUSH_CACHE_INST_OPCODE            "0x0"
+#  define ARM_FLUSH_CACHE_INST_RM                "c5"
+#  define ARM_FLUSH_CACHE_DATA_OPCODE            "0x0"
+#  define ARM_FLUSH_CACHE_DATA_RM                "c6"
+#  define ARM_FLUSH_CACHE_DATA_SINGLE_OPCODE     "0x1"
+#  define ARM_FLUSH_CACHE_DATA_SINGLE_RM         "c6"
+#  define ARM_CLEAN_CACHE_DATA_ENTRY_OPCODE      "0x1"
+#  define ARM_CLEAN_CACHE_DATA_ENTRY_RM          "c10"
+#  define ARM_DRAIN_CACHE_WRITE_BUFFER_OPCODE    "0x4"
+#  define ARM_DRAIN_CACHE_WRITE_BUFFER_RM        "c10"
+#endif /* __ASSEMBLER__ */
+
+/*                                               
+ * SA-1100 TLB Operations Definitions             
+ */                                              
+#ifdef __ASSEMBLER__
+#  define ARM_FLUSH_INST_DATA_TLB_OPCODE         0x0
+#  define ARM_FLUSH_INST_DATA_TLB_RM             c7
+#  define ARM_FLUSH_INST_TLB_OPCODE              0x0
+#  define ARM_FLUSH_INST_TLB_RM                  c5
+#  define ARM_FLUSH_DATA_TLB_OPCODE              0x0
+#  define ARM_FLUSH_DATA_TLB_RM                  c6
+#  define ARM_FLUSH_DATA_ENTRY_TLB_OPCODE        0x1
+#  define ARM_FLUSH_DATA_ENTRY_TLB_RM            c6
+#else /* __ASSEMBLER__ */
+#  define ARM_FLUSH_INST_DATA_TLB_OPCODE         "0x0"
+#  define ARM_FLUSH_INST_DATA_TLB_RM             "c7"
+#  define ARM_FLUSH_INST_TLB_OPCODE              "0x0"
+#  define ARM_FLUSH_INST_TLB_RM                  "c5"
+#  define ARM_FLUSH_DATA_TLB_OPCODE              "0x0"
+#  define ARM_FLUSH_DATA_TLB_RM                  "c6"
+#  define ARM_FLUSH_DATA_ENTRY_TLB_OPCODE        "0x1"
+#  define ARM_FLUSH_DATA_ENTRY_TLB_RM            "c6"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * SA-1100 Read-Buffer Operations Definitions
+ */
+#ifdef __ASSEMBLER__
+#  define ARM_FLUSH_ALL_BUFFERS_OPCODE           0x0
+#  define ARM_FLUSH_ALL_BUFFERS_RM               c0
+#  define ARM_FLUSH_BUFFER_0_OPCODE              0x1
+#  define ARM_FLUSH_BUFFER_0_RM                  c0
+#  define ARM_FLUSH_BUFFER_1_OPCODE              0x1
+#  define ARM_FLUSH_BUFFER_1_RM                  c1
+#  define ARM_FLUSH_BUFFER_2_OPCODE              0x1
+#  define ARM_FLUSH_BUFFER_2_RM                  c2
+#  define ARM_FLUSH_BUFFER_3_OPCODE              0x1
+#  define ARM_FLUSH_BUFFER_3_RM                  c3
+#  define ARM_LOAD_BUFFER_0_1_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_0_1_WORD_RM            c0
+#  define ARM_LOAD_BUFFER_0_4_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_0_4_WORD_RM            c4
+#  define ARM_LOAD_BUFFER_0_8_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_0_8_WORD_RM            c8
+#  define ARM_LOAD_BUFFER_1_1_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_1_1_WORD_RM            c1
+#  define ARM_LOAD_BUFFER_1_4_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_1_4_WORD_RM            c5
+#  define ARM_LOAD_BUFFER_1_8_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_1_8_WORD_RM            c9
+#  define ARM_LOAD_BUFFER_2_1_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_2_1_WORD_RM            c2
+#  define ARM_LOAD_BUFFER_2_4_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_2_4_WORD_RM            c6
+#  define ARM_LOAD_BUFFER_2_8_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_2_8_WORD_RM            cA
+#  define ARM_LOAD_BUFFER_3_1_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_3_1_WORD_RM            c3
+#  define ARM_LOAD_BUFFER_3_4_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_3_4_WORD_RM            c7
+#  define ARM_LOAD_BUFFER_3_8_WORD_OPCODE        0x2
+#  define ARM_LOAD_BUFFER_3_8_WORD_RM            cB
+#  define ARM_DISABLE_USER_MCR_ACCESS_OPCODE     0x4
+#  define ARM_DISABLE_USER_MCR_ACCESS_RM         c0
+#  define ARM_ENABLE_USER_MCR_ACCESS_OPCODE      0x5
+#  define ARM_ENABLE_USER_MCR_ACCESS_RM          c0
+#else /* __ASSEMBLER__ */
+#  define ARM_FLUSH_ALL_BUFFERS_OPCODE           "0x0"
+#  define ARM_FLUSH_ALL_BUFFERS_RM               "c0"
+#  define ARM_FLUSH_BUFFER_0_OPCODE              "0x1"
+#  define ARM_FLUSH_BUFFER_0_RM                  "c0"
+#  define ARM_FLUSH_BUFFER_1_OPCODE              "0x1"
+#  define ARM_FLUSH_BUFFER_1_RM                  "c1"
+#  define ARM_FLUSH_BUFFER_2_OPCODE              "0x1"
+#  define ARM_FLUSH_BUFFER_2_RM                  "c2"
+#  define ARM_FLUSH_BUFFER_3_OPCODE              "0x1"
+#  define ARM_FLUSH_BUFFER_3_RM                  "c3"
+#  define ARM_LOAD_BUFFER_0_1_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_0_1_WORD_RM            "c0"
+#  define ARM_LOAD_BUFFER_0_4_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_0_4_WORD_RM            "c4"
+#  define ARM_LOAD_BUFFER_0_8_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_0_8_WORD_RM            "c8"
+#  define ARM_LOAD_BUFFER_1_1_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_1_1_WORD_RM            "c1"
+#  define ARM_LOAD_BUFFER_1_4_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_1_4_WORD_RM            "c5"
+#  define ARM_LOAD_BUFFER_1_8_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_1_8_WORD_RM            "c9"
+#  define ARM_LOAD_BUFFER_2_1_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_2_1_WORD_RM            "c2"
+#  define ARM_LOAD_BUFFER_2_4_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_2_4_WORD_RM            "c6"
+#  define ARM_LOAD_BUFFER_2_8_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_2_8_WORD_RM            "cA"
+#  define ARM_LOAD_BUFFER_3_1_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_3_1_WORD_RM            "c3"
+#  define ARM_LOAD_BUFFER_3_4_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_3_4_WORD_RM            "c7"
+#  define ARM_LOAD_BUFFER_3_8_WORD_OPCODE        "0x2"
+#  define ARM_LOAD_BUFFER_3_8_WORD_RM            "cB"
+#  define ARM_DISABLE_USER_MCR_ACCESS_OPCODE     "0x4"
+#  define ARM_DISABLE_USER_MCR_ACCESS_RM         "c0"
+#  define ARM_ENABLE_USER_MCR_ACCESS_OPCODE      "0x5"
+#  define ARM_ENABLE_USER_MCR_ACCESS_RM          "c0"
+#endif /* __ASSEMBLER__ */
+
+/*
+ * ARM(R) First Level Descriptor Format Definitions
+ */
+#ifndef __ASSEMBLER__
+struct ARM_MMU_FIRST_LEVEL_FAULT {
+    int id : 2;
+    int sbz : 30;
+};
+#define ARM_MMU_FIRST_LEVEL_FAULT_ID 0x0
+
+struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE {
+    int id : 2;
+    int imp : 2;
+    int domain : 4;
+    int sbz : 1;
+    int base_address : 23;
+};
+#define ARM_MMU_FIRST_LEVEL_PAGE_TABLE_ID 0x1
+
+struct ARM_MMU_FIRST_LEVEL_SECTION {
+    int id : 2;
+    int b : 1;
+    int c : 1;
+    int imp : 1;
+    int domain : 4;
+    int sbz0 : 1;
+    int ap : 2;
+    int sbz1 : 8;
+    int base_address : 12;
+};
+#define ARM_MMU_FIRST_LEVEL_SECTION_ID 0x2
+
+struct ARM_MMU_FIRST_LEVEL_RESERVED {
+    int id : 2;
+    int sbz : 30;
+};
+#define ARM_MMU_FIRST_LEVEL_RESERVED_ID 0x3
+
+#define ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, table_index) \
+            (unsigned long *)((unsigned long)(ttb_base) + ((table_index) << 2))
+#define ARM_MMU_SECTION(ttb_base, actual_base, virtual_base, cacheable, bufferable, perm) \
+    {                                                                                     \
+        register union ARM_MMU_FIRST_LEVEL_DESCRIPTOR desc;                               \
+                                                                                          \
+        desc.word = 0;                                                                    \
+        desc.section.id = ARM_MMU_FIRST_LEVEL_SECTION_ID;                                 \
+        desc.section.domain = 0;                                                          \
+        desc.section.c = (cacheable);                                                     \
+        desc.section.b = (bufferable);                                                    \
+        desc.section.ap = (perm);                                                         \
+        desc.section.base_address = (actual_base);                                        \
+        *ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, (virtual_base)) = desc.word;    \
+    }
+
+union ARM_MMU_FIRST_LEVEL_DESCRIPTOR {
+    unsigned long word;
+    struct ARM_MMU_FIRST_LEVEL_FAULT fault;
+    struct ARM_MMU_FIRST_LEVEL_PAGE_TABLE page_table;
+    struct ARM_MMU_FIRST_LEVEL_SECTION section;
+    struct ARM_MMU_FIRST_LEVEL_RESERVED reserved;
+};
+
+#endif /* __ASSEMBLER__ */
+
+#define ARM_UNCACHEABLE                         0
+#define ARM_CACHEABLE                           1
+#define ARM_UNBUFFERABLE                        0
+#define ARM_BUFFERABLE                          1
+
+#define ARM_ACCESS_PERM_NONE_NONE               0
+#define ARM_ACCESS_PERM_RO_NONE                 0
+#define ARM_ACCESS_PERM_RO_RO                   0
+#define ARM_ACCESS_PERM_RW_NONE                 1
+#define ARM_ACCESS_PERM_RW_RO                   2
+#define ARM_ACCESS_PERM_RW_RW                   3
+
+#define ARM_SECTION_SIZE                        SZ_1M
+#define ARM_SMALL_PAGE_SIZE                     SZ_4K
+#define ARM_LARGE_PAGE_SIZE                     SZ_64K
+
+#define ARM_FIRST_LEVEL_PAGE_TABLE_SIZE         SZ_16K
+#define ARM_SECOND_LEVEL_PAGE_TABLE_SIZE        SZ_1K
+
+#endif /* MMU */
+
+#endif // __ARM_CPU_H__