Пример #1
0
static uint32_t set_translation_table_entries(
    const void *begin,
    const void *end,
    uint32_t section_flags
)
{
    uint32_t cl_size = arm_cp15_get_min_cache_line_size();
    uint32_t *ttb = arm_cp15_get_translation_table_base();
    uint32_t i = ARM_MMU_SECT_GET_INDEX(begin);
    uint32_t iend = ARM_MMU_SECT_GET_INDEX(ARM_MMU_SECT_MVA_ALIGN_UP(end));
    uint32_t index_mask = (1U << (32 - ARM_MMU_SECT_BASE_SHIFT)) - 1U;
    uint32_t ctrl;
    uint32_t section_flags_of_first_entry;

    ctrl = arm_cp15_mmu_disable(cl_size);
    arm_cp15_tlb_invalidate();
    section_flags_of_first_entry = ttb [i];

    while (i != iend) {
        uint32_t addr = i << ARM_MMU_SECT_BASE_SHIFT;

        ttb [i] = addr | section_flags;

        i = (i + 1U) & index_mask;
    }

    arm_cp15_set_control(ctrl);

    return section_flags_of_first_entry;
}
  static void BSP_START_SECTION lpc32xx_mmu_set_entries(
    uint32_t *ttb,
    const lpc32xx_mmu_config *config
  )
  {
    uint32_t i = ARM_MMU_SECT_GET_INDEX(config->begin);
    uint32_t iend =
      ARM_MMU_SECT_GET_INDEX(ARM_MMU_SECT_MVA_ALIGN_UP(config->end));

    if (config->begin != config->end) {
      while (i < iend) {
        ttb [i] = (i << ARM_MMU_SECT_BASE_SHIFT) | config->flags;
        ++i;
      }
    }
  }