--- a/hotspot/src/cpu/aarch64/vm/assembler_aarch64.hpp Thu Apr 28 17:36:37 2016 +0200
+++ b/hotspot/src/cpu/aarch64/vm/assembler_aarch64.hpp Thu Apr 28 13:26:29 2016 +0000
@@ -1032,12 +1032,28 @@
system(0b00, 0b011, 0b00011, SY, 0b110);
}
- void dc(Register Rt) {
- system(0b01, 0b011, 0b0111, 0b1011, 0b001, Rt);
+ void sys(int op1, int CRn, int CRm, int op2,
+ Register rt = (Register)0b11111) {
+ system(0b01, op1, CRn, CRm, op2, rt);
}
- void ic(Register Rt) {
- system(0b01, 0b011, 0b0111, 0b0101, 0b001, Rt);
+ // Only implement operations accessible from EL0 or higher, i.e.,
+ // op1 CRn CRm op2
+ // IC IVAU 3 7 5 1
+ // DC CVAC 3 7 10 1
+ // DC CVAU 3 7 11 1
+ // DC CIVAC 3 7 14 1
+ // DC ZVA 3 7 4 1
+ // So only deal with the CRm field.
+ enum icache_maintenance {IVAU = 0b0101};
+ enum dcache_maintenance {CVAC = 0b1010, CVAU = 0b1011, CIVAC = 0b1110, ZVA = 0b100};
+
+ void dc(dcache_maintenance cm, Register Rt) {
+ sys(0b011, 0b0111, cm, 0b001, Rt);
+ }
+
+ void ic(icache_maintenance cm, Register Rt) {
+ sys(0b011, 0b0111, cm, 0b001, Rt);
}
// A more convenient access to dmb for our purposes