1 /* 2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <arch.h> 8 #include <arch_helpers.h> 9 #include <assert.h> 10 #include <common_def.h> 11 #include <debug.h> 12 #include <errno.h> 13 #include <platform_def.h> 14 #include <string.h> 15 #include <types.h> 16 #include <utils.h> 17 #include <xlat_tables_arch_private.h> 18 #include <xlat_tables_defs.h> 19 #include <xlat_tables_v2.h> 20 21 #include "xlat_tables_private.h" 22 23 /* 24 * Each platform can define the size of its physical and virtual address spaces. 25 * If the platform hasn't defined one or both of them, default to 26 * ADDR_SPACE_SIZE. The latter is deprecated, though. 27 */ 28 #if ERROR_DEPRECATED 29 # ifdef ADDR_SPACE_SIZE 30 # error "ADDR_SPACE_SIZE is deprecated. Use PLAT_xxx_ADDR_SPACE_SIZE instead." 31 # endif 32 #elif defined(ADDR_SPACE_SIZE) 33 # ifndef PLAT_PHY_ADDR_SPACE_SIZE 34 # define PLAT_PHY_ADDR_SPACE_SIZE ADDR_SPACE_SIZE 35 # endif 36 # ifndef PLAT_VIRT_ADDR_SPACE_SIZE 37 # define PLAT_VIRT_ADDR_SPACE_SIZE ADDR_SPACE_SIZE 38 # endif 39 #endif 40 41 /* 42 * Allocate and initialise the default translation context for the BL image 43 * currently executing. 44 */ 45 REGISTER_XLAT_CONTEXT(tf, MAX_MMAP_REGIONS, MAX_XLAT_TABLES, 46 PLAT_VIRT_ADDR_SPACE_SIZE, PLAT_PHY_ADDR_SPACE_SIZE); 47 48 #if PLAT_XLAT_TABLES_DYNAMIC 49 50 /* 51 * The following functions assume that they will be called using subtables only. 52 * The base table can't be unmapped, so it is not needed to do any special 53 * handling for it. 54 */ 55 56 /* 57 * Returns the index of the array corresponding to the specified translation 58 * table. 59 */ 60 static int xlat_table_get_index(xlat_ctx_t *ctx, const uint64_t *table) 61 { 62 for (unsigned int i = 0; i < ctx->tables_num; i++) 63 if (ctx->tables[i] == table) 64 return i; 65 66 /* 67 * Maybe we were asked to get the index of the base level table, which 68 * should never happen. 69 */ 70 assert(0); 71 72 return -1; 73 } 74 75 /* Returns a pointer to an empty translation table. */ 76 static uint64_t *xlat_table_get_empty(xlat_ctx_t *ctx) 77 { 78 for (unsigned int i = 0; i < ctx->tables_num; i++) 79 if (ctx->tables_mapped_regions[i] == 0) 80 return ctx->tables[i]; 81 82 return NULL; 83 } 84 85 /* Increments region count for a given table. */ 86 static void xlat_table_inc_regions_count(xlat_ctx_t *ctx, const uint64_t *table) 87 { 88 ctx->tables_mapped_regions[xlat_table_get_index(ctx, table)]++; 89 } 90 91 /* Decrements region count for a given table. */ 92 static void xlat_table_dec_regions_count(xlat_ctx_t *ctx, const uint64_t *table) 93 { 94 ctx->tables_mapped_regions[xlat_table_get_index(ctx, table)]--; 95 } 96 97 /* Returns 0 if the speficied table isn't empty, otherwise 1. */ 98 static int xlat_table_is_empty(xlat_ctx_t *ctx, const uint64_t *table) 99 { 100 return !ctx->tables_mapped_regions[xlat_table_get_index(ctx, table)]; 101 } 102 103 #else /* PLAT_XLAT_TABLES_DYNAMIC */ 104 105 /* Returns a pointer to the first empty translation table. */ 106 static uint64_t *xlat_table_get_empty(xlat_ctx_t *ctx) 107 { 108 assert(ctx->next_table < ctx->tables_num); 109 110 return ctx->tables[ctx->next_table++]; 111 } 112 113 #endif /* PLAT_XLAT_TABLES_DYNAMIC */ 114 115 /* 116 * Returns a block/page table descriptor for the given level and attributes. 117 */ 118 uint64_t xlat_desc(const xlat_ctx_t *ctx, mmap_attr_t attr, 119 unsigned long long addr_pa, int level) 120 { 121 uint64_t desc; 122 int mem_type; 123 124 /* Make sure that the granularity is fine enough to map this address. */ 125 assert((addr_pa & XLAT_BLOCK_MASK(level)) == 0); 126 127 desc = addr_pa; 128 /* 129 * There are different translation table descriptors for level 3 and the 130 * rest. 131 */ 132 desc |= (level == XLAT_TABLE_LEVEL_MAX) ? PAGE_DESC : BLOCK_DESC; 133 /* 134 * Always set the access flag, as TF doesn't manage access flag faults. 135 * Deduce other fields of the descriptor based on the MT_NS and MT_RW 136 * memory region attributes. 137 */ 138 desc |= LOWER_ATTRS(ACCESS_FLAG); 139 140 desc |= (attr & MT_NS) ? LOWER_ATTRS(NS) : 0; 141 desc |= (attr & MT_RW) ? LOWER_ATTRS(AP_RW) : LOWER_ATTRS(AP_RO); 142 143 /* 144 * Do not allow unprivileged access when the mapping is for a privileged 145 * EL. For translation regimes that do not have mappings for access for 146 * lower exception levels, set AP[2] to AP_NO_ACCESS_UNPRIVILEGED. 147 */ 148 if (ctx->xlat_regime == EL1_EL0_REGIME) { 149 if (attr & MT_USER) { 150 /* EL0 mapping requested, so we give User access */ 151 desc |= LOWER_ATTRS(AP_ACCESS_UNPRIVILEGED); 152 } else { 153 /* EL1 mapping requested, no User access granted */ 154 desc |= LOWER_ATTRS(AP_NO_ACCESS_UNPRIVILEGED); 155 } 156 } else { 157 assert(ctx->xlat_regime == EL3_REGIME); 158 desc |= LOWER_ATTRS(AP_NO_ACCESS_UNPRIVILEGED); 159 } 160 161 /* 162 * Deduce shareability domain and executability of the memory region 163 * from the memory type of the attributes (MT_TYPE). 164 * 165 * Data accesses to device memory and non-cacheable normal memory are 166 * coherent for all observers in the system, and correspondingly are 167 * always treated as being Outer Shareable. Therefore, for these 2 types 168 * of memory, it is not strictly needed to set the shareability field 169 * in the translation tables. 170 */ 171 mem_type = MT_TYPE(attr); 172 if (mem_type == MT_DEVICE) { 173 desc |= LOWER_ATTRS(ATTR_DEVICE_INDEX | OSH); 174 /* 175 * Always map device memory as execute-never. 176 * This is to avoid the possibility of a speculative instruction 177 * fetch, which could be an issue if this memory region 178 * corresponds to a read-sensitive peripheral. 179 */ 180 desc |= xlat_arch_regime_get_xn_desc(ctx->xlat_regime); 181 182 } else { /* Normal memory */ 183 /* 184 * Always map read-write normal memory as execute-never. 185 * (Trusted Firmware doesn't self-modify its code, therefore 186 * R/W memory is reserved for data storage, which must not be 187 * executable.) 188 * Note that setting the XN bit here is for consistency only. 189 * The function that enables the MMU sets the SCTLR_ELx.WXN bit, 190 * which makes any writable memory region to be treated as 191 * execute-never, regardless of the value of the XN bit in the 192 * translation table. 193 * 194 * For read-only memory, rely on the MT_EXECUTE/MT_EXECUTE_NEVER 195 * attribute to figure out the value of the XN bit. The actual 196 * XN bit(s) to set in the descriptor depends on the context's 197 * translation regime and the policy applied in 198 * xlat_arch_regime_get_xn_desc(). 199 */ 200 if ((attr & MT_RW) || (attr & MT_EXECUTE_NEVER)) { 201 desc |= xlat_arch_regime_get_xn_desc(ctx->xlat_regime); 202 } 203 204 if (mem_type == MT_MEMORY) { 205 desc |= LOWER_ATTRS(ATTR_IWBWA_OWBWA_NTR_INDEX | ISH); 206 } else { 207 assert(mem_type == MT_NON_CACHEABLE); 208 desc |= LOWER_ATTRS(ATTR_NON_CACHEABLE_INDEX | OSH); 209 } 210 } 211 212 return desc; 213 } 214 215 /* 216 * Enumeration of actions that can be made when mapping table entries depending 217 * on the previous value in that entry and information about the region being 218 * mapped. 219 */ 220 typedef enum { 221 222 /* Do nothing */ 223 ACTION_NONE, 224 225 /* Write a block (or page, if in level 3) entry. */ 226 ACTION_WRITE_BLOCK_ENTRY, 227 228 /* 229 * Create a new table and write a table entry pointing to it. Recurse 230 * into it for further processing. 231 */ 232 ACTION_CREATE_NEW_TABLE, 233 234 /* 235 * There is a table descriptor in this entry, read it and recurse into 236 * that table for further processing. 237 */ 238 ACTION_RECURSE_INTO_TABLE, 239 240 } action_t; 241 242 #if PLAT_XLAT_TABLES_DYNAMIC 243 244 /* 245 * Recursive function that writes to the translation tables and unmaps the 246 * specified region. 247 */ 248 static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm, 249 const uintptr_t table_base_va, 250 uint64_t *const table_base, 251 const int table_entries, 252 const unsigned int level) 253 { 254 assert(level >= ctx->base_level && level <= XLAT_TABLE_LEVEL_MAX); 255 256 uint64_t *subtable; 257 uint64_t desc; 258 259 uintptr_t table_idx_va; 260 uintptr_t table_idx_end_va; /* End VA of this entry */ 261 262 uintptr_t region_end_va = mm->base_va + mm->size - 1; 263 264 int table_idx; 265 266 if (mm->base_va > table_base_va) { 267 /* Find the first index of the table affected by the region. */ 268 table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level); 269 270 table_idx = (table_idx_va - table_base_va) >> 271 XLAT_ADDR_SHIFT(level); 272 273 assert(table_idx < table_entries); 274 } else { 275 /* Start from the beginning of the table. */ 276 table_idx_va = table_base_va; 277 table_idx = 0; 278 } 279 280 while (table_idx < table_entries) { 281 282 table_idx_end_va = table_idx_va + XLAT_BLOCK_SIZE(level) - 1; 283 284 desc = table_base[table_idx]; 285 uint64_t desc_type = desc & DESC_MASK; 286 287 action_t action = ACTION_NONE; 288 289 if ((mm->base_va <= table_idx_va) && 290 (region_end_va >= table_idx_end_va)) { 291 292 /* Region covers all block */ 293 294 if (level == 3) { 295 /* 296 * Last level, only page descriptors allowed, 297 * erase it. 298 */ 299 assert(desc_type == PAGE_DESC); 300 301 action = ACTION_WRITE_BLOCK_ENTRY; 302 } else { 303 /* 304 * Other levels can have table descriptors. If 305 * so, recurse into it and erase descriptors 306 * inside it as needed. If there is a block 307 * descriptor, just erase it. If an invalid 308 * descriptor is found, this table isn't 309 * actually mapped, which shouldn't happen. 310 */ 311 if (desc_type == TABLE_DESC) { 312 action = ACTION_RECURSE_INTO_TABLE; 313 } else { 314 assert(desc_type == BLOCK_DESC); 315 action = ACTION_WRITE_BLOCK_ENTRY; 316 } 317 } 318 319 } else if ((mm->base_va <= table_idx_end_va) || 320 (region_end_va >= table_idx_va)) { 321 322 /* 323 * Region partially covers block. 324 * 325 * It can't happen in level 3. 326 * 327 * There must be a table descriptor here, if not there 328 * was a problem when mapping the region. 329 */ 330 331 assert(level < 3); 332 333 assert(desc_type == TABLE_DESC); 334 335 action = ACTION_RECURSE_INTO_TABLE; 336 } 337 338 if (action == ACTION_WRITE_BLOCK_ENTRY) { 339 340 table_base[table_idx] = INVALID_DESC; 341 xlat_arch_tlbi_va_regime(table_idx_va, ctx->xlat_regime); 342 343 } else if (action == ACTION_RECURSE_INTO_TABLE) { 344 345 subtable = (uint64_t *)(uintptr_t)(desc & TABLE_ADDR_MASK); 346 347 /* Recurse to write into subtable */ 348 xlat_tables_unmap_region(ctx, mm, table_idx_va, 349 subtable, XLAT_TABLE_ENTRIES, 350 level + 1); 351 352 /* 353 * If the subtable is now empty, remove its reference. 354 */ 355 if (xlat_table_is_empty(ctx, subtable)) { 356 table_base[table_idx] = INVALID_DESC; 357 xlat_arch_tlbi_va_regime(table_idx_va, 358 ctx->xlat_regime); 359 } 360 361 } else { 362 assert(action == ACTION_NONE); 363 } 364 365 table_idx++; 366 table_idx_va += XLAT_BLOCK_SIZE(level); 367 368 /* If reached the end of the region, exit */ 369 if (region_end_va <= table_idx_va) 370 break; 371 } 372 373 if (level > ctx->base_level) 374 xlat_table_dec_regions_count(ctx, table_base); 375 } 376 377 #endif /* PLAT_XLAT_TABLES_DYNAMIC */ 378 379 /* 380 * From the given arguments, it decides which action to take when mapping the 381 * specified region. 382 */ 383 static action_t xlat_tables_map_region_action(const mmap_region_t *mm, 384 const int desc_type, const unsigned long long dest_pa, 385 const uintptr_t table_entry_base_va, const unsigned int level) 386 { 387 uintptr_t mm_end_va = mm->base_va + mm->size - 1; 388 uintptr_t table_entry_end_va = 389 table_entry_base_va + XLAT_BLOCK_SIZE(level) - 1; 390 391 /* 392 * The descriptor types allowed depend on the current table level. 393 */ 394 395 if ((mm->base_va <= table_entry_base_va) && 396 (mm_end_va >= table_entry_end_va)) { 397 398 /* 399 * Table entry is covered by region 400 * -------------------------------- 401 * 402 * This means that this table entry can describe the whole 403 * translation with this granularity in principle. 404 */ 405 406 if (level == 3) { 407 /* 408 * Last level, only page descriptors are allowed. 409 */ 410 if (desc_type == PAGE_DESC) { 411 /* 412 * There's another region mapped here, don't 413 * overwrite. 414 */ 415 return ACTION_NONE; 416 } else { 417 assert(desc_type == INVALID_DESC); 418 return ACTION_WRITE_BLOCK_ENTRY; 419 } 420 421 } else { 422 423 /* 424 * Other levels. Table descriptors are allowed. Block 425 * descriptors too, but they have some limitations. 426 */ 427 428 if (desc_type == TABLE_DESC) { 429 /* There's already a table, recurse into it. */ 430 return ACTION_RECURSE_INTO_TABLE; 431 432 } else if (desc_type == INVALID_DESC) { 433 /* 434 * There's nothing mapped here, create a new 435 * entry. 436 * 437 * Check if the destination granularity allows 438 * us to use a block descriptor or we need a 439 * finer table for it. 440 * 441 * Also, check if the current level allows block 442 * descriptors. If not, create a table instead. 443 */ 444 if ((dest_pa & XLAT_BLOCK_MASK(level)) || 445 (level < MIN_LVL_BLOCK_DESC) || 446 (mm->granularity < XLAT_BLOCK_SIZE(level))) 447 return ACTION_CREATE_NEW_TABLE; 448 else 449 return ACTION_WRITE_BLOCK_ENTRY; 450 451 } else { 452 /* 453 * There's another region mapped here, don't 454 * overwrite. 455 */ 456 assert(desc_type == BLOCK_DESC); 457 458 return ACTION_NONE; 459 } 460 } 461 462 } else if ((mm->base_va <= table_entry_end_va) || 463 (mm_end_va >= table_entry_base_va)) { 464 465 /* 466 * Region partially covers table entry 467 * ----------------------------------- 468 * 469 * This means that this table entry can't describe the whole 470 * translation, a finer table is needed. 471 472 * There cannot be partial block overlaps in level 3. If that 473 * happens, some of the preliminary checks when adding the 474 * mmap region failed to detect that PA and VA must at least be 475 * aligned to PAGE_SIZE. 476 */ 477 assert(level < 3); 478 479 if (desc_type == INVALID_DESC) { 480 /* 481 * The block is not fully covered by the region. Create 482 * a new table, recurse into it and try to map the 483 * region with finer granularity. 484 */ 485 return ACTION_CREATE_NEW_TABLE; 486 487 } else { 488 assert(desc_type == TABLE_DESC); 489 /* 490 * The block is not fully covered by the region, but 491 * there is already a table here. Recurse into it and 492 * try to map with finer granularity. 493 * 494 * PAGE_DESC for level 3 has the same value as 495 * TABLE_DESC, but this code can't run on a level 3 496 * table because there can't be overlaps in level 3. 497 */ 498 return ACTION_RECURSE_INTO_TABLE; 499 } 500 } 501 502 /* 503 * This table entry is outside of the region specified in the arguments, 504 * don't write anything to it. 505 */ 506 return ACTION_NONE; 507 } 508 509 /* 510 * Recursive function that writes to the translation tables and maps the 511 * specified region. On success, it returns the VA of the last byte that was 512 * succesfully mapped. On error, it returns the VA of the next entry that 513 * should have been mapped. 514 */ 515 static uintptr_t xlat_tables_map_region(xlat_ctx_t *ctx, mmap_region_t *mm, 516 const uintptr_t table_base_va, 517 uint64_t *const table_base, 518 const int table_entries, 519 const unsigned int level) 520 { 521 assert(level >= ctx->base_level && level <= XLAT_TABLE_LEVEL_MAX); 522 523 uintptr_t mm_end_va = mm->base_va + mm->size - 1; 524 525 uintptr_t table_idx_va; 526 unsigned long long table_idx_pa; 527 528 uint64_t *subtable; 529 uint64_t desc; 530 531 int table_idx; 532 533 if (mm->base_va > table_base_va) { 534 /* Find the first index of the table affected by the region. */ 535 table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level); 536 537 table_idx = (table_idx_va - table_base_va) >> 538 XLAT_ADDR_SHIFT(level); 539 540 assert(table_idx < table_entries); 541 } else { 542 /* Start from the beginning of the table. */ 543 table_idx_va = table_base_va; 544 table_idx = 0; 545 } 546 547 #if PLAT_XLAT_TABLES_DYNAMIC 548 if (level > ctx->base_level) 549 xlat_table_inc_regions_count(ctx, table_base); 550 #endif 551 552 while (table_idx < table_entries) { 553 554 desc = table_base[table_idx]; 555 556 table_idx_pa = mm->base_pa + table_idx_va - mm->base_va; 557 558 action_t action = xlat_tables_map_region_action(mm, 559 desc & DESC_MASK, table_idx_pa, table_idx_va, level); 560 561 if (action == ACTION_WRITE_BLOCK_ENTRY) { 562 563 table_base[table_idx] = 564 xlat_desc(ctx, mm->attr, table_idx_pa, level); 565 566 } else if (action == ACTION_CREATE_NEW_TABLE) { 567 568 subtable = xlat_table_get_empty(ctx); 569 if (subtable == NULL) { 570 /* Not enough free tables to map this region */ 571 return table_idx_va; 572 } 573 574 /* Point to new subtable from this one. */ 575 table_base[table_idx] = TABLE_DESC | (unsigned long)subtable; 576 577 /* Recurse to write into subtable */ 578 uintptr_t end_va = xlat_tables_map_region(ctx, mm, table_idx_va, 579 subtable, XLAT_TABLE_ENTRIES, 580 level + 1); 581 if (end_va != table_idx_va + XLAT_BLOCK_SIZE(level) - 1) 582 return end_va; 583 584 } else if (action == ACTION_RECURSE_INTO_TABLE) { 585 586 subtable = (uint64_t *)(uintptr_t)(desc & TABLE_ADDR_MASK); 587 /* Recurse to write into subtable */ 588 uintptr_t end_va = xlat_tables_map_region(ctx, mm, table_idx_va, 589 subtable, XLAT_TABLE_ENTRIES, 590 level + 1); 591 if (end_va != table_idx_va + XLAT_BLOCK_SIZE(level) - 1) 592 return end_va; 593 594 } else { 595 596 assert(action == ACTION_NONE); 597 598 } 599 600 table_idx++; 601 table_idx_va += XLAT_BLOCK_SIZE(level); 602 603 /* If reached the end of the region, exit */ 604 if (mm_end_va <= table_idx_va) 605 break; 606 } 607 608 return table_idx_va - 1; 609 } 610 611 void print_mmap(mmap_region_t *const mmap) 612 { 613 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 614 tf_printf("mmap:\n"); 615 mmap_region_t *mm = mmap; 616 617 while (mm->size) { 618 tf_printf(" VA:%p PA:0x%llx size:0x%zx attr:0x%x", 619 (void *)mm->base_va, mm->base_pa, 620 mm->size, mm->attr); 621 tf_printf(" granularity:0x%zx\n", mm->granularity); 622 ++mm; 623 }; 624 tf_printf("\n"); 625 #endif 626 } 627 628 /* 629 * Function that verifies that a region can be mapped. 630 * Returns: 631 * 0: Success, the mapping is allowed. 632 * EINVAL: Invalid values were used as arguments. 633 * ERANGE: The memory limits were surpassed. 634 * ENOMEM: There is not enough memory in the mmap array. 635 * EPERM: Region overlaps another one in an invalid way. 636 */ 637 static int mmap_add_region_check(xlat_ctx_t *ctx, const mmap_region_t *mm) 638 { 639 unsigned long long base_pa = mm->base_pa; 640 uintptr_t base_va = mm->base_va; 641 size_t size = mm->size; 642 size_t granularity = mm->granularity; 643 644 unsigned long long end_pa = base_pa + size - 1; 645 uintptr_t end_va = base_va + size - 1; 646 647 if (!IS_PAGE_ALIGNED(base_pa) || !IS_PAGE_ALIGNED(base_va) || 648 !IS_PAGE_ALIGNED(size)) 649 return -EINVAL; 650 651 if ((granularity != XLAT_BLOCK_SIZE(1)) && 652 (granularity != XLAT_BLOCK_SIZE(2)) && 653 (granularity != XLAT_BLOCK_SIZE(3))) { 654 return -EINVAL; 655 } 656 657 /* Check for overflows */ 658 if ((base_pa > end_pa) || (base_va > end_va)) 659 return -ERANGE; 660 661 if ((base_va + (uintptr_t)size - (uintptr_t)1) > ctx->va_max_address) 662 return -ERANGE; 663 664 if ((base_pa + (unsigned long long)size - 1ULL) > ctx->pa_max_address) 665 return -ERANGE; 666 667 /* Check that there is space in the ctx->mmap array */ 668 if (ctx->mmap[ctx->mmap_num - 1].size != 0) 669 return -ENOMEM; 670 671 /* Check for PAs and VAs overlaps with all other regions */ 672 for (mmap_region_t *mm_cursor = ctx->mmap; 673 mm_cursor->size; ++mm_cursor) { 674 675 uintptr_t mm_cursor_end_va = mm_cursor->base_va 676 + mm_cursor->size - 1; 677 678 /* 679 * Check if one of the regions is completely inside the other 680 * one. 681 */ 682 int fully_overlapped_va = 683 ((base_va >= mm_cursor->base_va) && 684 (end_va <= mm_cursor_end_va)) || 685 686 ((mm_cursor->base_va >= base_va) && 687 (mm_cursor_end_va <= end_va)); 688 689 /* 690 * Full VA overlaps are only allowed if both regions are 691 * identity mapped (zero offset) or have the same VA to PA 692 * offset. Also, make sure that it's not the exact same area. 693 * This can only be done with static regions. 694 */ 695 if (fully_overlapped_va) { 696 697 #if PLAT_XLAT_TABLES_DYNAMIC 698 if ((mm->attr & MT_DYNAMIC) || 699 (mm_cursor->attr & MT_DYNAMIC)) 700 return -EPERM; 701 #endif /* PLAT_XLAT_TABLES_DYNAMIC */ 702 if ((mm_cursor->base_va - mm_cursor->base_pa) != 703 (base_va - base_pa)) 704 return -EPERM; 705 706 if ((base_va == mm_cursor->base_va) && 707 (size == mm_cursor->size)) 708 return -EPERM; 709 710 } else { 711 /* 712 * If the regions do not have fully overlapping VAs, 713 * then they must have fully separated VAs and PAs. 714 * Partial overlaps are not allowed 715 */ 716 717 unsigned long long mm_cursor_end_pa = 718 mm_cursor->base_pa + mm_cursor->size - 1; 719 720 int separated_pa = 721 (end_pa < mm_cursor->base_pa) || 722 (base_pa > mm_cursor_end_pa); 723 int separated_va = 724 (end_va < mm_cursor->base_va) || 725 (base_va > mm_cursor_end_va); 726 727 if (!(separated_va && separated_pa)) 728 return -EPERM; 729 } 730 } 731 732 return 0; 733 } 734 735 void mmap_add_region_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm) 736 { 737 mmap_region_t *mm_cursor = ctx->mmap; 738 mmap_region_t *mm_last = mm_cursor + ctx->mmap_num; 739 unsigned long long end_pa = mm->base_pa + mm->size - 1; 740 uintptr_t end_va = mm->base_va + mm->size - 1; 741 int ret; 742 743 /* Ignore empty regions */ 744 if (!mm->size) 745 return; 746 747 /* Static regions must be added before initializing the xlat tables. */ 748 assert(!ctx->initialized); 749 750 ret = mmap_add_region_check(ctx, mm); 751 if (ret != 0) { 752 ERROR("mmap_add_region_check() failed. error %d\n", ret); 753 assert(0); 754 return; 755 } 756 757 /* 758 * Find correct place in mmap to insert new region. 759 * 760 * 1 - Lower region VA end first. 761 * 2 - Smaller region size first. 762 * 763 * VA 0 0xFF 764 * 765 * 1st |------| 766 * 2nd |------------| 767 * 3rd |------| 768 * 4th |---| 769 * 5th |---| 770 * 6th |----------| 771 * 7th |-------------------------------------| 772 * 773 * This is required for overlapping regions only. It simplifies adding 774 * regions with the loop in xlat_tables_init_internal because the outer 775 * ones won't overwrite block or page descriptors of regions added 776 * previously. 777 * 778 * Overlapping is only allowed for static regions. 779 */ 780 781 while ((mm_cursor->base_va + mm_cursor->size - 1) < end_va 782 && mm_cursor->size) 783 ++mm_cursor; 784 785 while ((mm_cursor->base_va + mm_cursor->size - 1 == end_va) 786 && (mm_cursor->size < mm->size)) 787 ++mm_cursor; 788 789 /* Make room for new region by moving other regions up by one place */ 790 memmove(mm_cursor + 1, mm_cursor, 791 (uintptr_t)mm_last - (uintptr_t)mm_cursor); 792 793 /* 794 * Check we haven't lost the empty sentinel from the end of the array. 795 * This shouldn't happen as we have checked in mmap_add_region_check 796 * that there is free space. 797 */ 798 assert(mm_last->size == 0); 799 800 *mm_cursor = *mm; 801 802 if (end_pa > ctx->max_pa) 803 ctx->max_pa = end_pa; 804 if (end_va > ctx->max_va) 805 ctx->max_va = end_va; 806 } 807 808 void mmap_add_region(unsigned long long base_pa, 809 uintptr_t base_va, 810 size_t size, 811 mmap_attr_t attr) 812 { 813 mmap_region_t mm = MAP_REGION(base_pa, base_va, size, attr); 814 mmap_add_region_ctx(&tf_xlat_ctx, &mm); 815 } 816 817 818 void mmap_add_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm) 819 { 820 while (mm->size) { 821 mmap_add_region_ctx(ctx, mm); 822 mm++; 823 } 824 } 825 826 void mmap_add(const mmap_region_t *mm) 827 { 828 mmap_add_ctx(&tf_xlat_ctx, mm); 829 } 830 831 #if PLAT_XLAT_TABLES_DYNAMIC 832 833 int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm) 834 { 835 mmap_region_t *mm_cursor = ctx->mmap; 836 mmap_region_t *mm_last = mm_cursor + ctx->mmap_num; 837 unsigned long long end_pa = mm->base_pa + mm->size - 1; 838 uintptr_t end_va = mm->base_va + mm->size - 1; 839 int ret; 840 841 /* Nothing to do */ 842 if (!mm->size) 843 return 0; 844 845 /* Now this region is a dynamic one */ 846 mm->attr |= MT_DYNAMIC; 847 848 ret = mmap_add_region_check(ctx, mm); 849 if (ret != 0) 850 return ret; 851 852 /* 853 * Find the adequate entry in the mmap array in the same way done for 854 * static regions in mmap_add_region_ctx(). 855 */ 856 857 while ((mm_cursor->base_va + mm_cursor->size - 1) 858 < end_va && mm_cursor->size) 859 ++mm_cursor; 860 861 while ((mm_cursor->base_va + mm_cursor->size - 1 == end_va) 862 && (mm_cursor->size < mm->size)) 863 ++mm_cursor; 864 865 /* Make room for new region by moving other regions up by one place */ 866 memmove(mm_cursor + 1, mm_cursor, 867 (uintptr_t)mm_last - (uintptr_t)mm_cursor); 868 869 /* 870 * Check we haven't lost the empty sentinal from the end of the array. 871 * This shouldn't happen as we have checked in mmap_add_region_check 872 * that there is free space. 873 */ 874 assert(mm_last->size == 0); 875 876 *mm_cursor = *mm; 877 878 /* 879 * Update the translation tables if the xlat tables are initialized. If 880 * not, this region will be mapped when they are initialized. 881 */ 882 if (ctx->initialized) { 883 uintptr_t end_va = xlat_tables_map_region(ctx, mm_cursor, 884 0, ctx->base_table, ctx->base_table_entries, 885 ctx->base_level); 886 887 /* Failed to map, remove mmap entry, unmap and return error. */ 888 if (end_va != mm_cursor->base_va + mm_cursor->size - 1) { 889 memmove(mm_cursor, mm_cursor + 1, 890 (uintptr_t)mm_last - (uintptr_t)mm_cursor); 891 892 /* 893 * Check if the mapping function actually managed to map 894 * anything. If not, just return now. 895 */ 896 if (mm_cursor->base_va >= end_va) 897 return -ENOMEM; 898 899 /* 900 * Something went wrong after mapping some table 901 * entries, undo every change done up to this point. 902 */ 903 mmap_region_t unmap_mm = { 904 .base_pa = 0, 905 .base_va = mm->base_va, 906 .size = end_va - mm->base_va, 907 .attr = 0 908 }; 909 xlat_tables_unmap_region(ctx, &unmap_mm, 0, ctx->base_table, 910 ctx->base_table_entries, ctx->base_level); 911 912 return -ENOMEM; 913 } 914 915 /* 916 * Make sure that all entries are written to the memory. There 917 * is no need to invalidate entries when mapping dynamic regions 918 * because new table/block/page descriptors only replace old 919 * invalid descriptors, that aren't TLB cached. 920 */ 921 dsbishst(); 922 } 923 924 if (end_pa > ctx->max_pa) 925 ctx->max_pa = end_pa; 926 if (end_va > ctx->max_va) 927 ctx->max_va = end_va; 928 929 return 0; 930 } 931 932 int mmap_add_dynamic_region(unsigned long long base_pa, 933 uintptr_t base_va, size_t size, mmap_attr_t attr) 934 { 935 mmap_region_t mm = MAP_REGION(base_pa, base_va, size, attr); 936 return mmap_add_dynamic_region_ctx(&tf_xlat_ctx, &mm); 937 } 938 939 /* 940 * Removes the region with given base Virtual Address and size from the given 941 * context. 942 * 943 * Returns: 944 * 0: Success. 945 * EINVAL: Invalid values were used as arguments (region not found). 946 * EPERM: Tried to remove a static region. 947 */ 948 int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx, uintptr_t base_va, 949 size_t size) 950 { 951 mmap_region_t *mm = ctx->mmap; 952 mmap_region_t *mm_last = mm + ctx->mmap_num; 953 int update_max_va_needed = 0; 954 int update_max_pa_needed = 0; 955 956 /* Check sanity of mmap array. */ 957 assert(mm[ctx->mmap_num].size == 0); 958 959 while (mm->size) { 960 if ((mm->base_va == base_va) && (mm->size == size)) 961 break; 962 ++mm; 963 } 964 965 /* Check that the region was found */ 966 if (mm->size == 0) 967 return -EINVAL; 968 969 /* If the region is static it can't be removed */ 970 if (!(mm->attr & MT_DYNAMIC)) 971 return -EPERM; 972 973 /* Check if this region is using the top VAs or PAs. */ 974 if ((mm->base_va + mm->size - 1) == ctx->max_va) 975 update_max_va_needed = 1; 976 if ((mm->base_pa + mm->size - 1) == ctx->max_pa) 977 update_max_pa_needed = 1; 978 979 /* Update the translation tables if needed */ 980 if (ctx->initialized) { 981 xlat_tables_unmap_region(ctx, mm, 0, ctx->base_table, 982 ctx->base_table_entries, 983 ctx->base_level); 984 xlat_arch_tlbi_va_sync(); 985 } 986 987 /* Remove this region by moving the rest down by one place. */ 988 memmove(mm, mm + 1, (uintptr_t)mm_last - (uintptr_t)mm); 989 990 /* Check if we need to update the max VAs and PAs */ 991 if (update_max_va_needed) { 992 ctx->max_va = 0; 993 mm = ctx->mmap; 994 while (mm->size) { 995 if ((mm->base_va + mm->size - 1) > ctx->max_va) 996 ctx->max_va = mm->base_va + mm->size - 1; 997 ++mm; 998 } 999 } 1000 1001 if (update_max_pa_needed) { 1002 ctx->max_pa = 0; 1003 mm = ctx->mmap; 1004 while (mm->size) { 1005 if ((mm->base_pa + mm->size - 1) > ctx->max_pa) 1006 ctx->max_pa = mm->base_pa + mm->size - 1; 1007 ++mm; 1008 } 1009 } 1010 1011 return 0; 1012 } 1013 1014 int mmap_remove_dynamic_region(uintptr_t base_va, size_t size) 1015 { 1016 return mmap_remove_dynamic_region_ctx(&tf_xlat_ctx, 1017 base_va, size); 1018 } 1019 1020 #endif /* PLAT_XLAT_TABLES_DYNAMIC */ 1021 1022 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 1023 1024 /* Print the attributes of the specified block descriptor. */ 1025 static void xlat_desc_print(const xlat_ctx_t *ctx, uint64_t desc) 1026 { 1027 int mem_type_index = ATTR_INDEX_GET(desc); 1028 xlat_regime_t xlat_regime = ctx->xlat_regime; 1029 1030 if (mem_type_index == ATTR_IWBWA_OWBWA_NTR_INDEX) { 1031 tf_printf("MEM"); 1032 } else if (mem_type_index == ATTR_NON_CACHEABLE_INDEX) { 1033 tf_printf("NC"); 1034 } else { 1035 assert(mem_type_index == ATTR_DEVICE_INDEX); 1036 tf_printf("DEV"); 1037 } 1038 1039 const char *priv_str = "(PRIV)"; 1040 const char *user_str = "(USER)"; 1041 1042 /* 1043 * Showing Privileged vs Unprivileged only makes sense for EL1&0 1044 * mappings 1045 */ 1046 const char *ro_str = "-RO"; 1047 const char *rw_str = "-RW"; 1048 const char *no_access_str = "-NOACCESS"; 1049 1050 if (xlat_regime == EL3_REGIME) { 1051 /* For EL3, the AP[2] bit is all what matters */ 1052 tf_printf((desc & LOWER_ATTRS(AP_RO)) ? ro_str : rw_str); 1053 } else { 1054 const char *ap_str = (desc & LOWER_ATTRS(AP_RO)) ? ro_str : rw_str; 1055 tf_printf(ap_str); 1056 tf_printf(priv_str); 1057 /* 1058 * EL0 can only have the same permissions as EL1 or no 1059 * permissions at all. 1060 */ 1061 tf_printf((desc & LOWER_ATTRS(AP_ACCESS_UNPRIVILEGED)) 1062 ? ap_str : no_access_str); 1063 tf_printf(user_str); 1064 } 1065 1066 const char *xn_str = "-XN"; 1067 const char *exec_str = "-EXEC"; 1068 1069 if (xlat_regime == EL3_REGIME) { 1070 /* For EL3, the XN bit is all what matters */ 1071 tf_printf(LOWER_ATTRS(XN) & desc ? xn_str : exec_str); 1072 } else { 1073 /* For EL0 and EL1, we need to know who has which rights */ 1074 tf_printf(LOWER_ATTRS(PXN) & desc ? xn_str : exec_str); 1075 tf_printf(priv_str); 1076 1077 tf_printf(LOWER_ATTRS(UXN) & desc ? xn_str : exec_str); 1078 tf_printf(user_str); 1079 } 1080 1081 tf_printf(LOWER_ATTRS(NS) & desc ? "-NS" : "-S"); 1082 } 1083 1084 static const char * const level_spacers[] = { 1085 "[LV0] ", 1086 " [LV1] ", 1087 " [LV2] ", 1088 " [LV3] " 1089 }; 1090 1091 static const char *invalid_descriptors_ommited = 1092 "%s(%d invalid descriptors omitted)\n"; 1093 1094 /* 1095 * Recursive function that reads the translation tables passed as an argument 1096 * and prints their status. 1097 */ 1098 static void xlat_tables_print_internal(xlat_ctx_t *ctx, 1099 const uintptr_t table_base_va, 1100 uint64_t *const table_base, const int table_entries, 1101 const unsigned int level) 1102 { 1103 assert(level <= XLAT_TABLE_LEVEL_MAX); 1104 1105 uint64_t desc; 1106 uintptr_t table_idx_va = table_base_va; 1107 int table_idx = 0; 1108 1109 size_t level_size = XLAT_BLOCK_SIZE(level); 1110 1111 /* 1112 * Keep track of how many invalid descriptors are counted in a row. 1113 * Whenever multiple invalid descriptors are found, only the first one 1114 * is printed, and a line is added to inform about how many descriptors 1115 * have been omitted. 1116 */ 1117 int invalid_row_count = 0; 1118 1119 while (table_idx < table_entries) { 1120 1121 desc = table_base[table_idx]; 1122 1123 if ((desc & DESC_MASK) == INVALID_DESC) { 1124 1125 if (invalid_row_count == 0) { 1126 tf_printf("%sVA:%p size:0x%zx\n", 1127 level_spacers[level], 1128 (void *)table_idx_va, level_size); 1129 } 1130 invalid_row_count++; 1131 1132 } else { 1133 1134 if (invalid_row_count > 1) { 1135 tf_printf(invalid_descriptors_ommited, 1136 level_spacers[level], 1137 invalid_row_count - 1); 1138 } 1139 invalid_row_count = 0; 1140 1141 /* 1142 * Check if this is a table or a block. Tables are only 1143 * allowed in levels other than 3, but DESC_PAGE has the 1144 * same value as DESC_TABLE, so we need to check. 1145 */ 1146 if (((desc & DESC_MASK) == TABLE_DESC) && 1147 (level < XLAT_TABLE_LEVEL_MAX)) { 1148 /* 1149 * Do not print any PA for a table descriptor, 1150 * as it doesn't directly map physical memory 1151 * but instead points to the next translation 1152 * table in the translation table walk. 1153 */ 1154 tf_printf("%sVA:%p size:0x%zx\n", 1155 level_spacers[level], 1156 (void *)table_idx_va, level_size); 1157 1158 uintptr_t addr_inner = desc & TABLE_ADDR_MASK; 1159 1160 xlat_tables_print_internal(ctx, table_idx_va, 1161 (uint64_t *)addr_inner, 1162 XLAT_TABLE_ENTRIES, level + 1); 1163 } else { 1164 tf_printf("%sVA:%p PA:0x%llx size:0x%zx ", 1165 level_spacers[level], 1166 (void *)table_idx_va, 1167 (unsigned long long)(desc & TABLE_ADDR_MASK), 1168 level_size); 1169 xlat_desc_print(ctx, desc); 1170 tf_printf("\n"); 1171 } 1172 } 1173 1174 table_idx++; 1175 table_idx_va += level_size; 1176 } 1177 1178 if (invalid_row_count > 1) { 1179 tf_printf(invalid_descriptors_ommited, 1180 level_spacers[level], invalid_row_count - 1); 1181 } 1182 } 1183 1184 #endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */ 1185 1186 void xlat_tables_print(xlat_ctx_t *ctx) 1187 { 1188 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 1189 const char *xlat_regime_str; 1190 if (ctx->xlat_regime == EL1_EL0_REGIME) { 1191 xlat_regime_str = "1&0"; 1192 } else { 1193 assert(ctx->xlat_regime == EL3_REGIME); 1194 xlat_regime_str = "3"; 1195 } 1196 VERBOSE("Translation tables state:\n"); 1197 VERBOSE(" Xlat regime: EL%s\n", xlat_regime_str); 1198 VERBOSE(" Max allowed PA: 0x%llx\n", ctx->pa_max_address); 1199 VERBOSE(" Max allowed VA: %p\n", (void *) ctx->va_max_address); 1200 VERBOSE(" Max mapped PA: 0x%llx\n", ctx->max_pa); 1201 VERBOSE(" Max mapped VA: %p\n", (void *) ctx->max_va); 1202 1203 VERBOSE(" Initial lookup level: %i\n", ctx->base_level); 1204 VERBOSE(" Entries @initial lookup level: %i\n", 1205 ctx->base_table_entries); 1206 1207 int used_page_tables; 1208 #if PLAT_XLAT_TABLES_DYNAMIC 1209 used_page_tables = 0; 1210 for (unsigned int i = 0; i < ctx->tables_num; ++i) { 1211 if (ctx->tables_mapped_regions[i] != 0) 1212 ++used_page_tables; 1213 } 1214 #else 1215 used_page_tables = ctx->next_table; 1216 #endif 1217 VERBOSE(" Used %i sub-tables out of %i (spare: %i)\n", 1218 used_page_tables, ctx->tables_num, 1219 ctx->tables_num - used_page_tables); 1220 1221 xlat_tables_print_internal(ctx, 0, ctx->base_table, 1222 ctx->base_table_entries, ctx->base_level); 1223 #endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */ 1224 } 1225 1226 void init_xlat_tables_ctx(xlat_ctx_t *ctx) 1227 { 1228 assert(ctx != NULL); 1229 assert(!ctx->initialized); 1230 assert(ctx->xlat_regime == EL3_REGIME || ctx->xlat_regime == EL1_EL0_REGIME); 1231 assert(!is_mmu_enabled_ctx(ctx)); 1232 1233 mmap_region_t *mm = ctx->mmap; 1234 1235 print_mmap(mm); 1236 1237 /* All tables must be zeroed before mapping any region. */ 1238 1239 for (unsigned int i = 0; i < ctx->base_table_entries; i++) 1240 ctx->base_table[i] = INVALID_DESC; 1241 1242 for (unsigned int j = 0; j < ctx->tables_num; j++) { 1243 #if PLAT_XLAT_TABLES_DYNAMIC 1244 ctx->tables_mapped_regions[j] = 0; 1245 #endif 1246 for (unsigned int i = 0; i < XLAT_TABLE_ENTRIES; i++) 1247 ctx->tables[j][i] = INVALID_DESC; 1248 } 1249 1250 while (mm->size) { 1251 uintptr_t end_va = xlat_tables_map_region(ctx, mm, 0, ctx->base_table, 1252 ctx->base_table_entries, ctx->base_level); 1253 1254 if (end_va != mm->base_va + mm->size - 1) { 1255 ERROR("Not enough memory to map region:\n" 1256 " VA:%p PA:0x%llx size:0x%zx attr:0x%x\n", 1257 (void *)mm->base_va, mm->base_pa, mm->size, mm->attr); 1258 panic(); 1259 } 1260 1261 mm++; 1262 } 1263 1264 assert(ctx->pa_max_address <= xlat_arch_get_max_supported_pa()); 1265 assert(ctx->max_va <= ctx->va_max_address); 1266 assert(ctx->max_pa <= ctx->pa_max_address); 1267 1268 ctx->initialized = 1; 1269 1270 xlat_tables_print(ctx); 1271 } 1272 1273 void init_xlat_tables(void) 1274 { 1275 init_xlat_tables_ctx(&tf_xlat_ctx); 1276 } 1277 1278 /* 1279 * If dynamic allocation of new regions is disabled then by the time we call the 1280 * function enabling the MMU, we'll have registered all the memory regions to 1281 * map for the system's lifetime. Therefore, at this point we know the maximum 1282 * physical address that will ever be mapped. 1283 * 1284 * If dynamic allocation is enabled then we can't make any such assumption 1285 * because the maximum physical address could get pushed while adding a new 1286 * region. Therefore, in this case we have to assume that the whole address 1287 * space size might be mapped. 1288 */ 1289 #ifdef PLAT_XLAT_TABLES_DYNAMIC 1290 #define MAX_PHYS_ADDR tf_xlat_ctx.pa_max_address 1291 #else 1292 #define MAX_PHYS_ADDR tf_xlat_ctx.max_pa 1293 #endif 1294 1295 #ifdef AARCH32 1296 1297 void enable_mmu_secure(unsigned int flags) 1298 { 1299 enable_mmu_arch(flags, tf_xlat_ctx.base_table, MAX_PHYS_ADDR, 1300 tf_xlat_ctx.va_max_address); 1301 } 1302 1303 #else 1304 1305 void enable_mmu_el1(unsigned int flags) 1306 { 1307 enable_mmu_arch(flags, tf_xlat_ctx.base_table, MAX_PHYS_ADDR, 1308 tf_xlat_ctx.va_max_address); 1309 } 1310 1311 void enable_mmu_el3(unsigned int flags) 1312 { 1313 enable_mmu_arch(flags, tf_xlat_ctx.base_table, MAX_PHYS_ADDR, 1314 tf_xlat_ctx.va_max_address); 1315 } 1316 1317 #endif /* AARCH32 */ 1318 1319 /* 1320 * Do a translation table walk to find the block or page descriptor that maps 1321 * virtual_addr. 1322 * 1323 * On success, return the address of the descriptor within the translation 1324 * table. Its lookup level is stored in '*out_level'. 1325 * On error, return NULL. 1326 * 1327 * xlat_table_base 1328 * Base address for the initial lookup level. 1329 * xlat_table_base_entries 1330 * Number of entries in the translation table for the initial lookup level. 1331 * virt_addr_space_size 1332 * Size in bytes of the virtual address space. 1333 */ 1334 static uint64_t *find_xlat_table_entry(uintptr_t virtual_addr, 1335 void *xlat_table_base, 1336 int xlat_table_base_entries, 1337 unsigned long long virt_addr_space_size, 1338 int *out_level) 1339 { 1340 unsigned int start_level; 1341 uint64_t *table; 1342 int entries; 1343 1344 VERBOSE("%s(%p)\n", __func__, (void *)virtual_addr); 1345 1346 start_level = GET_XLAT_TABLE_LEVEL_BASE(virt_addr_space_size); 1347 VERBOSE("Starting translation table walk from level %i\n", start_level); 1348 1349 table = xlat_table_base; 1350 entries = xlat_table_base_entries; 1351 1352 for (unsigned int level = start_level; 1353 level <= XLAT_TABLE_LEVEL_MAX; 1354 ++level) { 1355 int idx; 1356 uint64_t desc; 1357 uint64_t desc_type; 1358 1359 VERBOSE("Table address: %p\n", (void *)table); 1360 1361 idx = XLAT_TABLE_IDX(virtual_addr, level); 1362 VERBOSE("Index into level %i table: %i\n", level, idx); 1363 if (idx >= entries) { 1364 VERBOSE("Invalid address\n"); 1365 return NULL; 1366 } 1367 1368 desc = table[idx]; 1369 desc_type = desc & DESC_MASK; 1370 VERBOSE("Descriptor at level %i: 0x%llx\n", level, 1371 (unsigned long long)desc); 1372 1373 if (desc_type == INVALID_DESC) { 1374 VERBOSE("Invalid entry (memory not mapped)\n"); 1375 return NULL; 1376 } 1377 1378 if (level == XLAT_TABLE_LEVEL_MAX) { 1379 /* 1380 * There can't be table entries at the final lookup 1381 * level. 1382 */ 1383 assert(desc_type == PAGE_DESC); 1384 VERBOSE("Descriptor mapping a memory page (size: 0x%llx)\n", 1385 (unsigned long long)XLAT_BLOCK_SIZE(XLAT_TABLE_LEVEL_MAX)); 1386 *out_level = level; 1387 return &table[idx]; 1388 } 1389 1390 if (desc_type == BLOCK_DESC) { 1391 VERBOSE("Descriptor mapping a memory block (size: 0x%llx)\n", 1392 (unsigned long long)XLAT_BLOCK_SIZE(level)); 1393 *out_level = level; 1394 return &table[idx]; 1395 } 1396 1397 assert(desc_type == TABLE_DESC); 1398 VERBOSE("Table descriptor, continuing xlat table walk...\n"); 1399 table = (uint64_t *)(uintptr_t)(desc & TABLE_ADDR_MASK); 1400 entries = XLAT_TABLE_ENTRIES; 1401 } 1402 1403 /* 1404 * This shouldn't be reached, the translation table walk should end at 1405 * most at level XLAT_TABLE_LEVEL_MAX and return from inside the loop. 1406 */ 1407 assert(0); 1408 1409 return NULL; 1410 } 1411 1412 1413 static int get_mem_attributes_internal(const xlat_ctx_t *ctx, uintptr_t base_va, 1414 mmap_attr_t *attributes, uint64_t **table_entry, 1415 unsigned long long *addr_pa, int *table_level) 1416 { 1417 uint64_t *entry; 1418 uint64_t desc; 1419 int level; 1420 unsigned long long virt_addr_space_size; 1421 1422 /* 1423 * Sanity-check arguments. 1424 */ 1425 assert(ctx != NULL); 1426 assert(ctx->initialized); 1427 assert(ctx->xlat_regime == EL1_EL0_REGIME || ctx->xlat_regime == EL3_REGIME); 1428 1429 virt_addr_space_size = (unsigned long long)ctx->va_max_address + 1; 1430 assert(virt_addr_space_size > 0); 1431 1432 entry = find_xlat_table_entry(base_va, 1433 ctx->base_table, 1434 ctx->base_table_entries, 1435 virt_addr_space_size, 1436 &level); 1437 if (entry == NULL) { 1438 WARN("Address %p is not mapped.\n", (void *)base_va); 1439 return -EINVAL; 1440 } 1441 1442 if (addr_pa != NULL) { 1443 *addr_pa = *entry & TABLE_ADDR_MASK; 1444 } 1445 1446 if (table_entry != NULL) { 1447 *table_entry = entry; 1448 } 1449 1450 if (table_level != NULL) { 1451 *table_level = level; 1452 } 1453 1454 desc = *entry; 1455 1456 #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 1457 VERBOSE("Attributes: "); 1458 xlat_desc_print(ctx, desc); 1459 tf_printf("\n"); 1460 #endif /* LOG_LEVEL >= LOG_LEVEL_VERBOSE */ 1461 1462 assert(attributes != NULL); 1463 *attributes = 0; 1464 1465 int attr_index = (desc >> ATTR_INDEX_SHIFT) & ATTR_INDEX_MASK; 1466 1467 if (attr_index == ATTR_IWBWA_OWBWA_NTR_INDEX) { 1468 *attributes |= MT_MEMORY; 1469 } else if (attr_index == ATTR_NON_CACHEABLE_INDEX) { 1470 *attributes |= MT_NON_CACHEABLE; 1471 } else { 1472 assert(attr_index == ATTR_DEVICE_INDEX); 1473 *attributes |= MT_DEVICE; 1474 } 1475 1476 int ap2_bit = (desc >> AP2_SHIFT) & 1; 1477 1478 if (ap2_bit == AP2_RW) 1479 *attributes |= MT_RW; 1480 1481 if (ctx->xlat_regime == EL1_EL0_REGIME) { 1482 int ap1_bit = (desc >> AP1_SHIFT) & 1; 1483 if (ap1_bit == AP1_ACCESS_UNPRIVILEGED) 1484 *attributes |= MT_USER; 1485 } 1486 1487 int ns_bit = (desc >> NS_SHIFT) & 1; 1488 1489 if (ns_bit == 1) 1490 *attributes |= MT_NS; 1491 1492 uint64_t xn_mask = xlat_arch_regime_get_xn_desc(ctx->xlat_regime); 1493 1494 if ((desc & xn_mask) == xn_mask) { 1495 *attributes |= MT_EXECUTE_NEVER; 1496 } else { 1497 assert((desc & xn_mask) == 0); 1498 } 1499 1500 return 0; 1501 } 1502 1503 1504 int get_mem_attributes(const xlat_ctx_t *ctx, uintptr_t base_va, 1505 mmap_attr_t *attributes) 1506 { 1507 return get_mem_attributes_internal(ctx, base_va, attributes, 1508 NULL, NULL, NULL); 1509 } 1510 1511 1512 int change_mem_attributes(xlat_ctx_t *ctx, 1513 uintptr_t base_va, 1514 size_t size, 1515 mmap_attr_t attr) 1516 { 1517 /* Note: This implementation isn't optimized. */ 1518 1519 assert(ctx != NULL); 1520 assert(ctx->initialized); 1521 1522 unsigned long long virt_addr_space_size = 1523 (unsigned long long)ctx->va_max_address + 1; 1524 assert(virt_addr_space_size > 0); 1525 1526 if (!IS_PAGE_ALIGNED(base_va)) { 1527 WARN("%s: Address %p is not aligned on a page boundary.\n", 1528 __func__, (void *)base_va); 1529 return -EINVAL; 1530 } 1531 1532 if (size == 0) { 1533 WARN("%s: Size is 0.\n", __func__); 1534 return -EINVAL; 1535 } 1536 1537 if ((size % PAGE_SIZE) != 0) { 1538 WARN("%s: Size 0x%zx is not a multiple of a page size.\n", 1539 __func__, size); 1540 return -EINVAL; 1541 } 1542 1543 if (((attr & MT_EXECUTE_NEVER) == 0) && ((attr & MT_RW) != 0)) { 1544 WARN("%s() doesn't allow to remap memory as read-write and executable.\n", 1545 __func__); 1546 return -EINVAL; 1547 } 1548 1549 int pages_count = size / PAGE_SIZE; 1550 1551 VERBOSE("Changing memory attributes of %i pages starting from address %p...\n", 1552 pages_count, (void *)base_va); 1553 1554 uintptr_t base_va_original = base_va; 1555 1556 /* 1557 * Sanity checks. 1558 */ 1559 for (int i = 0; i < pages_count; ++i) { 1560 uint64_t *entry; 1561 uint64_t desc; 1562 int level; 1563 1564 entry = find_xlat_table_entry(base_va, 1565 ctx->base_table, 1566 ctx->base_table_entries, 1567 virt_addr_space_size, 1568 &level); 1569 if (entry == NULL) { 1570 WARN("Address %p is not mapped.\n", (void *)base_va); 1571 return -EINVAL; 1572 } 1573 1574 desc = *entry; 1575 1576 /* 1577 * Check that all the required pages are mapped at page 1578 * granularity. 1579 */ 1580 if (((desc & DESC_MASK) != PAGE_DESC) || 1581 (level != XLAT_TABLE_LEVEL_MAX)) { 1582 WARN("Address %p is not mapped at the right granularity.\n", 1583 (void *)base_va); 1584 WARN("Granularity is 0x%llx, should be 0x%x.\n", 1585 (unsigned long long)XLAT_BLOCK_SIZE(level), PAGE_SIZE); 1586 return -EINVAL; 1587 } 1588 1589 /* 1590 * If the region type is device, it shouldn't be executable. 1591 */ 1592 int attr_index = (desc >> ATTR_INDEX_SHIFT) & ATTR_INDEX_MASK; 1593 if (attr_index == ATTR_DEVICE_INDEX) { 1594 if ((attr & MT_EXECUTE_NEVER) == 0) { 1595 WARN("Setting device memory as executable at address %p.", 1596 (void *)base_va); 1597 return -EINVAL; 1598 } 1599 } 1600 1601 base_va += PAGE_SIZE; 1602 } 1603 1604 /* Restore original value. */ 1605 base_va = base_va_original; 1606 1607 VERBOSE("%s: All pages are mapped, now changing their attributes...\n", 1608 __func__); 1609 1610 for (int i = 0; i < pages_count; ++i) { 1611 1612 mmap_attr_t old_attr, new_attr; 1613 uint64_t *entry; 1614 int level; 1615 unsigned long long addr_pa; 1616 1617 get_mem_attributes_internal(ctx, base_va, &old_attr, 1618 &entry, &addr_pa, &level); 1619 1620 VERBOSE("Old attributes: 0x%x\n", old_attr); 1621 1622 /* 1623 * From attr, only MT_RO/MT_RW, MT_EXECUTE/MT_EXECUTE_NEVER and 1624 * MT_USER/MT_PRIVILEGED are taken into account. Any other 1625 * information is ignored. 1626 */ 1627 1628 /* Clean the old attributes so that they can be rebuilt. */ 1629 new_attr = old_attr & ~(MT_RW|MT_EXECUTE_NEVER|MT_USER); 1630 1631 /* 1632 * Update attributes, but filter out the ones this function 1633 * isn't allowed to change. 1634 */ 1635 new_attr |= attr & (MT_RW|MT_EXECUTE_NEVER|MT_USER); 1636 1637 VERBOSE("New attributes: 0x%x\n", new_attr); 1638 1639 /* 1640 * The break-before-make sequence requires writing an invalid 1641 * descriptor and making sure that the system sees the change 1642 * before writing the new descriptor. 1643 */ 1644 *entry = INVALID_DESC; 1645 1646 /* Invalidate any cached copy of this mapping in the TLBs. */ 1647 xlat_arch_tlbi_va_regime(base_va, ctx->xlat_regime); 1648 1649 /* Ensure completion of the invalidation. */ 1650 xlat_arch_tlbi_va_sync(); 1651 1652 /* Write new descriptor */ 1653 *entry = xlat_desc(ctx, new_attr, addr_pa, level); 1654 1655 base_va += PAGE_SIZE; 1656 } 1657 1658 /* Ensure that the last descriptor writen is seen by the system. */ 1659 dsbish(); 1660 1661 return 0; 1662 } 1663