PERFORCE change 218927 for review
Robert Watson
rwatson at FreeBSD.org
Mon Oct 22 21:23:13 UTC 2012
http://p4web.freebsd.org/@@218927?ac=10
Change 218927 by rwatson at rwatson_svr_ctsrd_mipsbuild on 2012/10/22 21:22:46
Now that immediate-indexed notation is supported for CHERI CLC and
CSC, use it. It's not quite the syntax documented in the manual,
but it still allows us to lose assertions that immediate offsets are
0, which will improve context switch code significantly.
Affected files ...
.. //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cheri.h#8 edit
Differences ...
==== //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cheri.h#8 (text+ko) ====
@@ -153,24 +153,12 @@
/*
* Capability store; while this doesn't muck with c0, it does require a memory
* clobber.
- *
- * XXXRW: The assembler does not yet support base+offset, just base, so assert
- * that offset (for now) is not permitted.
*/
-#ifdef _KERNEL
#define CHERI_CSC(cs, cb, regbase, offset) do { \
- KASSERT((offset) == 0, \
- ("CHERI_CSC: non-zero offset not supported")); \
- __asm__ __volatile__ ("csc $c%0, %1($c%2)" : : \
- "i" (cs), "r" (regbase), "i" (cb) : "memory"); \
+ __asm__ __volatile__ ("csc $c%0, %1, %2($c%3)" : : \
+ "i" (cs), "r" (regbase), "i" (offset), "i" (cb) : \
+ "memory"); \
} while (0)
-#else
-#define CHERI_CSC(cs, cb, regbase, offset) do { \
- assert((offset) == 0); \
- __asm__ __volatile__ ("csc $c%0, %1($c%2)" : : \
- "i" (cs), "r" (regbase), "i" (cb) : "memory"); \
-} while (0)
-#endif
/*
* Routines that modify or replace values in capability registers, and that if
@@ -233,32 +221,15 @@
"i" (cd), "i" (cb), "r" (v)); \
} while (0)
-/*
- * XXXRW: The assembler does not yet support base+offset, just base, so assert
- * that offset (for now) is not permitted.
- */
-#ifdef _KERNEL
#define CHERI_CLC(cd, cb, regbase, offset) do { \
- KASSERT((offset) == 0, \
- ("CHERI_CLC: non-zero offset not supported")); \
if ((cd) == 0) \
- __asm__ __volatile__ ("clc $c%0, %1($c%2)" : : \
- "i" (cd), "r" (regbase), "i" (cb) : "memory"); \
+ __asm__ __volatile__ ("clc $c%0, %1, %2($c%3)" : : \
+ "i" (cd), "r" (regbase), "i" (offset), "i" (cb) : \
+ "memory"); \
else \
- __asm__ __volatile__ ("clc $c%0, %1($c%2)" : : \
- "i" (cd), "r" (regbase), "i" (cb)); \
+ __asm__ __volatile__ ("clc $c%0, %1, %2($c%3)" : : \
+ "i" (cd), "r" (regbase), "i" (offset), "i" (cb)); \
} while (0)
-#else
-#define CHERI_CLC(cd, cb, regbase, offset) do { \
- assert((offset) == 0); \
- if ((cd) == 0) \
- __asm__ __volatile__ ("clc $c%0, %1($c%2)" : : \
- "i" (cd), "r" (regbase), "i" (cb) : "memory"); \
- else \
- __asm__ __volatile__ ("clc $c%0, %1($c%2)" : : \
- "i" (cd), "r" (regbase), "i" (cb)); \
-} while (0)
-#endif
static inline void
cp2_capability_load(u_int crn_to, struct chericap *cp)
More information about the p4-projects
mailing list