[PATCH] CONFIG_VECTORS_BASE vs. 0xffff0000 documentation
Domenico Andreoli
cavokz at gmail.com
Mon Apr 11 17:03:46 EDT 2011
From: Domenico Andreoli <cavokz at gmail.com>
Nice explanation of CONFIG_VECTORS_BASE vs. 0xffff0000 usage. Save it
to make annoying people avoid not obvious questions.
Signed-off-by: Domenico Andreoli <cavokz at gmail.com>
---
Documentation/arm/memory.txt | 35 +++++++++++++++++++++++++++++++++++
arch/arm/mm/mmu.c | 3 +++
2 files changed, 38 insertions(+)
Index: b/Documentation/arm/memory.txt
===================================================================
--- a/Documentation/arm/memory.txt 2011-04-11 22:39:45.000000000 +0200
+++ b/Documentation/arm/memory.txt 2011-04-11 22:50:48.000000000 +0200
@@ -91,3 +91,38 @@
must not access any memory which is not mapped inside their 0x0001000
to TASK_SIZE address range. If they wish to access these areas, they
must set up their own mappings using open() and mmap().
+
+
+About using CONFIG_VECTORS_BASE and 0xffff0000
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On CPU cores with a MMU, there are only two possibilities for the
+location of the vector page: either address 0, or address 0xffff0000.
+Some CPUs only supports the low vectors i.e. at 0. Most others allow
+for a selection between either of those addresses using the V bit
+in the control register (see the vectors_high() macro for example).
+In those cases replacing 0xffff0000 with CONFIG_VECTORS_BASE is the
+wrong thing to do.
+
+Now, because the vector table and associated stubs are quite small,
+we also use the same memory page for other things such as read-only
+code segments made available to user space. So to simplify things,
+the vector page is _always_ mapped at 0xffff0000, regardless if the CPU
+supports high vectors or not (if it doesn't then another mapping for
+the same page is installed at 0). So also in this case it is wrong to
+substitute 0xffff0000 with CONFIG_VECTORS_BASE.
+
+Finally, on non-MMU processors, the actual vector table is often in ROM
+and no RAM page can be mapped to the vector address because of course
+there is no MMU. In this case, all vectors (except for the reset one)
+are usually branching to some arbitrary location in RAM to allow the
+installed software to redirect them. This is where CONFIG_VECTORS_BASE
+really makes sense as it should be set to the address of the memory
+area that the OS can modify to hook its exception handlers.
+
+So using CONFIG_VECTORS_BASE really depends on the context. For shared
+code between the MMU and non-MMU cases with access to the vector page,
+then it makes sense to use CONFIG_VECTORS_BASE, and in the MMU case it
+shouldn't be set to anything other than 0xffff0000.
+
+ -- Nicolas Pitre
Index: b/arch/arm/mm/mmu.c
===================================================================
--- a/arch/arm/mm/mmu.c 2011-04-11 22:40:01.000000000 +0200
+++ b/arch/arm/mm/mmu.c 2011-04-11 22:42:10.000000000 +0200
@@ -964,6 +964,9 @@
* Create a mapping for the machine vectors at the high-vectors
* location (0xffff0000). If we aren't using high-vectors, also
* create a mapping at the low-vectors virtual address.
+ *
+ * Read Documentation/arm/memory.txt in case you want to replace
+ * 0xffff0000 with CONFIG_VECTORS_BASE.
*/
map.pfn = __phys_to_pfn(virt_to_phys(vectors_page));
map.virtual = 0xffff0000;
More information about the linux-arm-kernel
mailing list