extern reg_t armv7m_gdb_dummy_cpsr_reg;
 #endif
 
+static int cortex_m3_has_mmu(struct target_s *target, bool *has_mmu)
+{
+       *has_mmu = false;
+       return ERROR_OK;
+}
+
 static int cortexm3_dap_read_coreregister_u32(swjdp_common_t *swjdp,
                uint32_t *value, int regnum)
 {
        .register_commands = cortex_m3_register_commands,
        .target_create = cortex_m3_target_create,
        .init_target = cortex_m3_init_target,
+       .has_mmu = cortex_m3_has_mmu,
        .examine = cortex_m3_examine,
 };
 
 
 
 static int default_mmu(struct target_s *target, int *enabled)
 {
-       *enabled = 0;
+       LOG_ERROR("Not implemented.");
+       return ERROR_FAIL;
+}
+
+static int default_has_mmu(struct target_s *target, bool *has_mmu)
+{
+       *has_mmu = true;
        return ERROR_OK;
 }
 
 
 static int default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
-       LOG_ERROR("Not implemented");
-       return ERROR_FAIL;
+       int retval;
+       bool mmu;
+       retval = target->type->has_mmu(target, &mmu);
+       if (retval != ERROR_OK)
+               return retval;
+       if (mmu)
+       {
+               LOG_ERROR("Not implemented");
+               return ERROR_FAIL;
+       }
+       return target_read_memory(target, address, size, count, buffer);
 }
 
 static int default_write_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
 {
-       LOG_ERROR("Not implemented");
-       return ERROR_FAIL;
+       int retval;
+       bool mmu;
+       retval = target->type->has_mmu(target, &mmu);
+       if (retval != ERROR_OK)
+               return retval;
+       if (mmu)
+       {
+               LOG_ERROR("Not implemented");
+               return ERROR_FAIL;
+       }
+       return target_write_memory(target, address, size, count, buffer);
 }
 
 
                {
                        target->type->mmu = default_mmu;
                }
+               if (target->type->has_mmu == NULL)
+               {
+                       target->type->has_mmu = default_has_mmu;
+               }
                target = target->next;
        }
 
 
         */
        int (*write_phys_memory)(struct target_s *target, uint32_t phys_address, uint32_t size, uint32_t count, uint8_t *buffer);
 
+       /* returns true if the mmu is enabled. Default implementation returns error. */
        int (*mmu)(struct target_s *target, int *enabled);
 
+       /* returns true if the target has an mmu. This can only be
+       determined after the target has been examined.
+       
+       Default implementation returns success and has_mmu==true.
+       */
+       int (*has_mmu)(struct target_s *target, bool *has_mmu);
+
        /* Read coprocessor - arm specific. Default implementation returns error. */
        int (*mrc)(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value);