36
36
.level 2.0
37
37
#endif
38
38
39
+ /*
40
+ * We need seven instructions after a TLB insert for it to take effect.
41
+ * The PA8800/PA8900 processors are an exception and need 12 instructions.
42
+ * The RFI changes both IAOQ_Back and IAOQ_Front, so it counts as one.
43
+ */
44
+ #ifdef CONFIG_64BIT
45
+ #define NUM_PIPELINE_INSNS 12
46
+ #else
47
+ #define NUM_PIPELINE_INSNS 7
48
+ #endif
49
+
50
+ /* Insert num nops */
51
+ .macro insert_nops num
52
+ .rept \num
53
+ nop
54
+ .endr
55
+ .endm
56
+
39
57
/* Get aligned page_table_lock address for this mm from cr28/tr4 */
40
58
.macro get_ptl reg
41
59
mfctl %cr28,\reg
415
433
3:
416
434
.endm
417
435
418
- /* Release page_table_lock without reloading lock address.
419
- We use an ordered store to ensure all prior accesses are
420
- performed prior to releasing the lock. */
421
- .macro ptl_unlock0 spc,tmp,tmp2
436
+ /* Release page_table_lock if for user space. We use an ordered
437
+ store to ensure all prior accesses are performed prior to
438
+ releasing the lock. Note stw may not be executed, so we
439
+ provide one extra nop when CONFIG_TLB_PTLOCK is defined. */
440
+ .macro ptl_unlock spc,tmp,tmp2
422
441
#ifdef CONFIG_TLB_PTLOCK
423
- 98: ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2
442
+ 98: get_ptl \tmp
443
+ ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2
424
444
or ,COND(=) %r0,\spc,%r0
425
445
stw,ma \tmp2,0 (\tmp)
426
446
99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
427
- #endif
428
- .endm
429
-
430
- /* Release page_table_lock. */
431
- .macro ptl_unlock1 spc,tmp,tmp2
432
- #ifdef CONFIG_TLB_PTLOCK
433
- 98: get_ptl \tmp
434
- ptl_unlock0 \spc,\tmp,\tmp2
435
- 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP)
447
+ insert_nops NUM_PIPELINE_INSNS - 4
448
+ #else
449
+ insert_nops NUM_PIPELINE_INSNS - 1
436
450
#endif
437
451
.endm
438
452
@@ -1124,7 +1138,7 @@ dtlb_miss_20w:
1124
1138
1125
1139
idtlbt pte,prot
1126
1140
1127
- ptl_unlock1 spc,t0,t1
1141
+ ptl_unlock spc,t0,t1
1128
1142
rfir
1129
1143
nop
1130
1144
@@ -1133,6 +1147,7 @@ dtlb_check_alias_20w:
1133
1147
1134
1148
idtlbt pte,prot
1135
1149
1150
+ insert_nops NUM_PIPELINE_INSNS - 1
1136
1151
rfir
1137
1152
nop
1138
1153
@@ -1150,7 +1165,7 @@ nadtlb_miss_20w:
1150
1165
1151
1166
idtlbt pte,prot
1152
1167
1153
- ptl_unlock1 spc,t0,t1
1168
+ ptl_unlock spc,t0,t1
1154
1169
rfir
1155
1170
nop
1156
1171
@@ -1159,6 +1174,7 @@ nadtlb_check_alias_20w:
1159
1174
1160
1175
idtlbt pte,prot
1161
1176
1177
+ insert_nops NUM_PIPELINE_INSNS - 1
1162
1178
rfir
1163
1179
nop
1164
1180
@@ -1184,7 +1200,7 @@ dtlb_miss_11:
1184
1200
1185
1201
mtsp t1, %sr1 /* Restore sr1 */
1186
1202
1187
- ptl_unlock1 spc,t0,t1
1203
+ ptl_unlock spc,t0,t1
1188
1204
rfir
1189
1205
nop
1190
1206
@@ -1194,6 +1210,7 @@ dtlb_check_alias_11:
1194
1210
idtlba pte,(va)
1195
1211
idtlbp prot,(va)
1196
1212
1213
+ insert_nops NUM_PIPELINE_INSNS - 1
1197
1214
rfir
1198
1215
nop
1199
1216
@@ -1217,7 +1234,7 @@ nadtlb_miss_11:
1217
1234
1218
1235
mtsp t1, %sr1 /* Restore sr1 */
1219
1236
1220
- ptl_unlock1 spc,t0,t1
1237
+ ptl_unlock spc,t0,t1
1221
1238
rfir
1222
1239
nop
1223
1240
@@ -1227,6 +1244,7 @@ nadtlb_check_alias_11:
1227
1244
idtlba pte,(va)
1228
1245
idtlbp prot,(va)
1229
1246
1247
+ insert_nops NUM_PIPELINE_INSNS - 1
1230
1248
rfir
1231
1249
nop
1232
1250
@@ -1246,7 +1264,7 @@ dtlb_miss_20:
1246
1264
1247
1265
idtlbt pte,prot
1248
1266
1249
- ptl_unlock1 spc,t0,t1
1267
+ ptl_unlock spc,t0,t1
1250
1268
rfir
1251
1269
nop
1252
1270
@@ -1255,6 +1273,7 @@ dtlb_check_alias_20:
1255
1273
1256
1274
idtlbt pte,prot
1257
1275
1276
+ insert_nops NUM_PIPELINE_INSNS - 1
1258
1277
rfir
1259
1278
nop
1260
1279
@@ -1274,7 +1293,7 @@ nadtlb_miss_20:
1274
1293
1275
1294
idtlbt pte,prot
1276
1295
1277
- ptl_unlock1 spc,t0,t1
1296
+ ptl_unlock spc,t0,t1
1278
1297
rfir
1279
1298
nop
1280
1299
@@ -1283,6 +1302,7 @@ nadtlb_check_alias_20:
1283
1302
1284
1303
idtlbt pte,prot
1285
1304
1305
+ insert_nops NUM_PIPELINE_INSNS - 1
1286
1306
rfir
1287
1307
nop
1288
1308
@@ -1319,7 +1339,7 @@ itlb_miss_20w:
1319
1339
1320
1340
iitlbt pte,prot
1321
1341
1322
- ptl_unlock1 spc,t0,t1
1342
+ ptl_unlock spc,t0,t1
1323
1343
rfir
1324
1344
nop
1325
1345
@@ -1343,7 +1363,7 @@ naitlb_miss_20w:
1343
1363
1344
1364
iitlbt pte,prot
1345
1365
1346
- ptl_unlock1 spc,t0,t1
1366
+ ptl_unlock spc,t0,t1
1347
1367
rfir
1348
1368
nop
1349
1369
@@ -1352,6 +1372,7 @@ naitlb_check_alias_20w:
1352
1372
1353
1373
iitlbt pte,prot
1354
1374
1375
+ insert_nops NUM_PIPELINE_INSNS - 1
1355
1376
rfir
1356
1377
nop
1357
1378
@@ -1377,7 +1398,7 @@ itlb_miss_11:
1377
1398
1378
1399
mtsp t1, %sr1 /* Restore sr1 */
1379
1400
1380
- ptl_unlock1 spc,t0,t1
1401
+ ptl_unlock spc,t0,t1
1381
1402
rfir
1382
1403
nop
1383
1404
@@ -1401,7 +1422,7 @@ naitlb_miss_11:
1401
1422
1402
1423
mtsp t1, %sr1 /* Restore sr1 */
1403
1424
1404
- ptl_unlock1 spc,t0,t1
1425
+ ptl_unlock spc,t0,t1
1405
1426
rfir
1406
1427
nop
1407
1428
@@ -1411,6 +1432,7 @@ naitlb_check_alias_11:
1411
1432
iitlba pte,(%sr0, va)
1412
1433
iitlbp prot,(%sr0, va)
1413
1434
1435
+ insert_nops NUM_PIPELINE_INSNS - 1
1414
1436
rfir
1415
1437
nop
1416
1438
@@ -1431,7 +1453,7 @@ itlb_miss_20:
1431
1453
1432
1454
iitlbt pte,prot
1433
1455
1434
- ptl_unlock1 spc,t0,t1
1456
+ ptl_unlock spc,t0,t1
1435
1457
rfir
1436
1458
nop
1437
1459
@@ -1451,7 +1473,7 @@ naitlb_miss_20:
1451
1473
1452
1474
iitlbt pte,prot
1453
1475
1454
- ptl_unlock1 spc,t0,t1
1476
+ ptl_unlock spc,t0,t1
1455
1477
rfir
1456
1478
nop
1457
1479
@@ -1460,6 +1482,7 @@ naitlb_check_alias_20:
1460
1482
1461
1483
iitlbt pte,prot
1462
1484
1485
+ insert_nops NUM_PIPELINE_INSNS - 1
1463
1486
rfir
1464
1487
nop
1465
1488
@@ -1481,7 +1504,7 @@ dbit_trap_20w:
1481
1504
1482
1505
idtlbt pte,prot
1483
1506
1484
- ptl_unlock0 spc,t0,t1
1507
+ ptl_unlock spc,t0,t1
1485
1508
rfir
1486
1509
nop
1487
1510
#else
@@ -1507,7 +1530,7 @@ dbit_trap_11:
1507
1530
1508
1531
mtsp t1, %sr1 /* Restore sr1 */
1509
1532
1510
- ptl_unlock0 spc,t0,t1
1533
+ ptl_unlock spc,t0,t1
1511
1534
rfir
1512
1535
nop
1513
1536
@@ -1527,7 +1550,7 @@ dbit_trap_20:
1527
1550
1528
1551
idtlbt pte,prot
1529
1552
1530
- ptl_unlock0 spc,t0,t1
1553
+ ptl_unlock spc,t0,t1
1531
1554
rfir
1532
1555
nop
1533
1556
#endif
0 commit comments