powerpc/64s: use start, size rather than start, end for exception handlers
Nicholas Piggin
reviewerRFC PATCH 1/1 powerpc/64s: use start, size rather than start, end for exception handlers
start,size has the benefit of being easier to search for (start,end usually gives you the preceeding vector from the one you want, as first result).
Suggested-by Benjamin Herrenschmidt <[email protected]>
Signed-off-by Nicholas Piggin <[email protected]>
--- arch/powerpc/include/asm/head-64.h | 158 ++++++++++++++-------------- arch/powerpc/kernel/exceptions-64s.S | 195 ++++++++++++++++++----------------- 2 files changed, 185 insertions(+), 168 deletions(-)
arch/powerpc/include/asm/head-64.h +82 -76
@@ -38,8 +38,8 @@* li r10,128 * mv r11,r10 -* FIXED_SECTION_ENTRY_BEGIN_LOCATION(section_name, label2, start_address) -* FIXED_SECTION_ENTRY_END_LOCATION(section_name, label2, end_address) +* FIXED_SECTION_ENTRY_BEGIN_LOCATION(section_name, label2, start_address, size) +* FIXED_SECTION_ENTRY_END_LOCATION(section_name, label2, start_address, size) * CLOSE_FIXED_SECTION(section_name) * * ZERO_FIXED_SECTION can be used to emit zeroed data.
@@ -102,9 +102,15 @@ end_##sname:#define FIXED_SECTION_ENTRY_BEGIN (sname, name) \ __FIXED_SECTION_ENTRY_BEGIN(sname, name, IFETCH_ALIGN_BYTES) -#define FIXED_SECTION_ENTRY_BEGIN_LOCATION (sname, name, start) \ +#define FIXED_SECTION_ENTRY_BEGIN_LOCATION (sname, name, start, size) \ USE_FIXED_SECTION(sname); \ name##_start = (start); \ + .if ((start) % (size) != 0); \ + .error "Fixed section exception vector misalignment"; \ + .endif; \ + .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100); \ + .error "Fixed section exception vector bad size"; \ + .endif; \ .if (start) < sname##_start; \ .error "Fixed section underflow"; \ .abort; \
@@ -113,16 +119,16 @@ end_##sname: .global name; \ name: -#define FIXED_SECTION_ENTRY_END_LOCATION (sname, name, end) \ - .if (end) > sname##_end; \ +#define FIXED_SECTION_ENTRY_END_LOCATION (sname, name, start, size) \ + .if (start) + (size) > sname##_end; \ .error "Fixed section overflow"; \ .abort; \ .endif; \ - .if (. - name > end - name##_start); \ + .if (. - name > (start) + (size) - name##_start); \ .error "Fixed entry overflow"; \ .abort; \ .endif; \ - . = ((end) - sname##_start); \ + . = ((start) + (size) - sname##_start); \/*
@@ -191,17 +197,17 @@ end_##sname:* and OOL handlers are implemented as types of TRAMP and TRAMP_VIRT handlers. */ -#define EXC_REAL_BEGIN (name, start, end) \ - FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start) +#define EXC_REAL_BEGIN (name, start, size) \ + FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start, size) -#define EXC_REAL_END (name, start, end) \ - FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##name, end) +#define EXC_REAL_END (name, start, size) \ + FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##name, start, size) -#define EXC_VIRT_BEGIN (name, start, end) \ - FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##name, start) +#define EXC_VIRT_BEGIN (name, start, size) \ + FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size) -#define EXC_VIRT_END (name, start, end) \ - FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##name, end) +#define EXC_VIRT_END (name, start, size) \ + FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size)#define EXC_COMMON_BEGIN (name) \ USE_TEXT_SECTION(); \
@@ -223,140 +229,140 @@ end_##sname:#define TRAMP_KVM_BEGIN (name)#endif -#define EXC_REAL_NONE (start, end) \ - FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##unused, start); \ - FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##unused, end) +#define EXC_REAL_NONE (start, size) \ + FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##unused, start, size); \ + FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##unused, start, size) -#define EXC_VIRT_NONE (start, end) \ - FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##unused, start); \ - FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, end); +#define EXC_VIRT_NONE (start, size) \ + FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); \ + FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); -#define EXC_REAL (name, start, end) \ - EXC_REAL_BEGIN(name, start, end); \ +#define EXC_REAL (name, start, size) \ + EXC_REAL_BEGIN(name, start, size); \ STD_EXCEPTION_PSERIES(start, name##_common); \ - EXC_REAL_END(name, start, end); + EXC_REAL_END(name, start, size); -#define EXC_VIRT (name, start, end, realvec) \ - EXC_VIRT_BEGIN(name, start, end); \ +#define EXC_VIRT (name, start, size, realvec) \ + EXC_VIRT_BEGIN(name, start, size); \ STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \ - EXC_VIRT_END(name, start, end); + EXC_VIRT_END(name, start, size); -#define EXC_REAL_MASKABLE (name, start, end) \ - EXC_REAL_BEGIN(name, start, end); \ +#define EXC_REAL_MASKABLE (name, start, size) \ + EXC_REAL_BEGIN(name, start, size); \ MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \ - EXC_REAL_END(name, start, end); + EXC_REAL_END(name, start, size); -#define EXC_VIRT_MASKABLE (name, start, end, realvec) \ - EXC_VIRT_BEGIN(name, start, end); \ +#define EXC_VIRT_MASKABLE (name, start, size, realvec) \ + EXC_VIRT_BEGIN(name, start, size); \ MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \ - EXC_VIRT_END(name, start, end); + EXC_VIRT_END(name, start, size); -#define EXC_REAL_HV (name, start, end) \ - EXC_REAL_BEGIN(name, start, end); \ +#define EXC_REAL_HV (name, start, size) \ + EXC_REAL_BEGIN(name, start, size); \ STD_EXCEPTION_HV(start, start, name##_common); \ - EXC_REAL_END(name, start, end); + EXC_REAL_END(name, start, size); -#define EXC_VIRT_HV (name, start, end, realvec) \ - EXC_VIRT_BEGIN(name, start, end); \ +#define EXC_VIRT_HV (name, start, size, realvec) \ + EXC_VIRT_BEGIN(name, start, size); \ STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \ - EXC_VIRT_END(name, start, end); + EXC_VIRT_END(name, start, size); -#define __EXC_REAL_OOL (name, start, end) \ - EXC_REAL_BEGIN(name, start, end); \ +#define __EXC_REAL_OOL (name, start, size) \ + EXC_REAL_BEGIN(name, start, size); \ __OOL_EXCEPTION(start, label, tramp_real_##name); \ - EXC_REAL_END(name, start, end); + EXC_REAL_END(name, start, size);#define __TRAMP_REAL_OOL (name, vec) \ TRAMP_REAL_BEGIN(tramp_real_##name); \ STD_EXCEPTION_PSERIES_OOL(vec, name##_common); \ -#define EXC_REAL_OOL (name, start, end) \ - __EXC_REAL_OOL(name, start, end); \ +#define EXC_REAL_OOL (name, start, size) \ + __EXC_REAL_OOL(name, start, size); \ __TRAMP_REAL_OOL(name, start); -#define __EXC_REAL_OOL_MASKABLE (name, start, end) \ - __EXC_REAL_OOL(name, start, end); +#define __EXC_REAL_OOL_MASKABLE (name, start, size) \ + __EXC_REAL_OOL(name, start, size);#define __TRAMP_REAL_OOL_MASKABLE (name, vec) \ TRAMP_REAL_BEGIN(tramp_real_##name); \ MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \ -#define EXC_REAL_OOL_MASKABLE (name, start, end) \ - __EXC_REAL_OOL_MASKABLE(name, start, end); \ +#define EXC_REAL_OOL_MASKABLE (name, start, size) \ + __EXC_REAL_OOL_MASKABLE(name, start, size); \ __TRAMP_REAL_OOL_MASKABLE(name, start); -#define __EXC_REAL_OOL_HV_DIRECT (name, start, end, handler) \ - EXC_REAL_BEGIN(name, start, end); \ +#define __EXC_REAL_OOL_HV_DIRECT (name, start, size, handler) \ + EXC_REAL_BEGIN(name, start, size); \ __OOL_EXCEPTION(start, label, handler); \ - EXC_REAL_END(name, start, end); + EXC_REAL_END(name, start, size); -#define __EXC_REAL_OOL_HV (name, start, end) \ - __EXC_REAL_OOL(name, start, end); +#define __EXC_REAL_OOL_HV (name, start, size) \ + __EXC_REAL_OOL(name, start, size);#define __TRAMP_REAL_OOL_HV (name, vec) \ TRAMP_REAL_BEGIN(tramp_real_##name); \ STD_EXCEPTION_HV_OOL(vec, name##_common); \ -#define EXC_REAL_OOL_HV (name, start, end) \ - __EXC_REAL_OOL_HV(name, start, end); \ +#define EXC_REAL_OOL_HV (name, start, size) \ + __EXC_REAL_OOL_HV(name, start, size); \ __TRAMP_REAL_OOL_HV(name, start); -#define __EXC_REAL_OOL_MASKABLE_HV (name, start, end) \ - __EXC_REAL_OOL(name, start, end); +#define __EXC_REAL_OOL_MASKABLE_HV (name, start, size) \ + __EXC_REAL_OOL(name, start, size);#define __TRAMP_REAL_OOL_MASKABLE_HV (name, vec) \ TRAMP_REAL_BEGIN(tramp_real_##name); \ MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \ -#define EXC_REAL_OOL_MASKABLE_HV (name, start, end) \ - __EXC_REAL_OOL_MASKABLE_HV(name, start, end); \ +#define EXC_REAL_OOL_MASKABLE_HV (name, start, size) \ + __EXC_REAL_OOL_MASKABLE_HV(name, start, size); \ __TRAMP_REAL_OOL_MASKABLE_HV(name, start); -#define __EXC_VIRT_OOL (name, start, end) \ - EXC_VIRT_BEGIN(name, start, end); \ +#define __EXC_VIRT_OOL (name, start, size) \ + EXC_VIRT_BEGIN(name, start, size); \ __OOL_EXCEPTION(start, label, tramp_virt_##name); \ - EXC_VIRT_END(name, start, end); + EXC_VIRT_END(name, start, size);#define __TRAMP_VIRT_OOL (name, realvec) \ TRAMP_VIRT_BEGIN(tramp_virt_##name); \ STD_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \ -#define EXC_VIRT_OOL (name, start, end, realvec) \ - __EXC_VIRT_OOL(name, start, end); \ +#define EXC_VIRT_OOL (name, start, size, realvec) \ + __EXC_VIRT_OOL(name, start, size); \ __TRAMP_VIRT_OOL(name, realvec); -#define __EXC_VIRT_OOL_MASKABLE (name, start, end) \ - __EXC_VIRT_OOL(name, start, end); +#define __EXC_VIRT_OOL_MASKABLE (name, start, size) \ + __EXC_VIRT_OOL(name, start, size);#define __TRAMP_VIRT_OOL_MASKABLE (name, realvec) \ TRAMP_VIRT_BEGIN(tramp_virt_##name); \ MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \ -#define EXC_VIRT_OOL_MASKABLE (name, start, end, realvec) \ - __EXC_VIRT_OOL_MASKABLE(name, start, end); \ +#define EXC_VIRT_OOL_MASKABLE (name, start, size, realvec) \ + __EXC_VIRT_OOL_MASKABLE(name, start, size); \ __TRAMP_VIRT_OOL_MASKABLE(name, realvec); -#define __EXC_VIRT_OOL_HV (name, start, end) \ - __EXC_VIRT_OOL(name, start, end); +#define __EXC_VIRT_OOL_HV (name, start, size) \ + __EXC_VIRT_OOL(name, start, size);#define __TRAMP_VIRT_OOL_HV (name, realvec) \ TRAMP_VIRT_BEGIN(tramp_virt_##name); \ STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \ -#define EXC_VIRT_OOL_HV (name, start, end, realvec) \ - __EXC_VIRT_OOL_HV(name, start, end); \ +#define EXC_VIRT_OOL_HV (name, start, size, realvec) \ + __EXC_VIRT_OOL_HV(name, start, size); \ __TRAMP_VIRT_OOL_HV(name, realvec); -#define __EXC_VIRT_OOL_MASKABLE_HV (name, start, end) \ - __EXC_VIRT_OOL(name, start, end); +#define __EXC_VIRT_OOL_MASKABLE_HV (name, start, size) \ + __EXC_VIRT_OOL(name, start, size);#define __TRAMP_VIRT_OOL_MASKABLE_HV (name, realvec) \ TRAMP_VIRT_BEGIN(tramp_virt_##name); \ MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \ -#define EXC_VIRT_OOL_MASKABLE_HV (name, start, end, realvec) \ - __EXC_VIRT_OOL_MASKABLE_HV(name, start, end); \ +#define EXC_VIRT_OOL_MASKABLE_HV (name, start, size, realvec) \ + __EXC_VIRT_OOL_MASKABLE_HV(name, start, size); \ __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec);#define TRAMP_KVM (area, n) \
arch/powerpc/kernel/exceptions-64s.S +103 -92
453 lines not on this page · raw message
Signature · 1 line
2.10.2
Michael Ellerman
AppliedQuoted 6 lines · Nicholas Piggin
start,size has the benefit of being easier to search for (start,end usually gives you the preceeding vector from the one you want, as first result).
Suggested-by Benjamin Herrenschmidt <[email protected]>Signed-off-by Nicholas Piggin <[email protected]>
Applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/1a6822d194c3f627eeb6aaca6688a5
cheers