|
@@ -636,17 +636,19 @@ struct pfault_refbk {
|
|
|
u64 reserved;
|
|
|
} __attribute__ ((packed, aligned(8)));
|
|
|
|
|
|
+static struct pfault_refbk pfault_init_refbk = {
|
|
|
+ .refdiagc = 0x258,
|
|
|
+ .reffcode = 0,
|
|
|
+ .refdwlen = 5,
|
|
|
+ .refversn = 2,
|
|
|
+ .refgaddr = __LC_LPP,
|
|
|
+ .refselmk = 1ULL << 48,
|
|
|
+ .refcmpmk = 1ULL << 48,
|
|
|
+ .reserved = __PF_RES_FIELD
|
|
|
+};
|
|
|
+
|
|
|
int pfault_init(void)
|
|
|
{
|
|
|
- struct pfault_refbk refbk = {
|
|
|
- .refdiagc = 0x258,
|
|
|
- .reffcode = 0,
|
|
|
- .refdwlen = 5,
|
|
|
- .refversn = 2,
|
|
|
- .refgaddr = __LC_LPP,
|
|
|
- .refselmk = 1ULL << 48,
|
|
|
- .refcmpmk = 1ULL << 48,
|
|
|
- .reserved = __PF_RES_FIELD };
|
|
|
int rc;
|
|
|
|
|
|
if (pfault_disable)
|
|
@@ -658,18 +660,20 @@ int pfault_init(void)
|
|
|
"1: la %0,8\n"
|
|
|
"2:\n"
|
|
|
EX_TABLE(0b,1b)
|
|
|
- : "=d" (rc) : "a" (&refbk), "m" (refbk) : "cc");
|
|
|
+ : "=d" (rc)
|
|
|
+ : "a" (&pfault_init_refbk), "m" (pfault_init_refbk) : "cc");
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static struct pfault_refbk pfault_fini_refbk = {
|
|
|
+ .refdiagc = 0x258,
|
|
|
+ .reffcode = 1,
|
|
|
+ .refdwlen = 5,
|
|
|
+ .refversn = 2,
|
|
|
+};
|
|
|
+
|
|
|
void pfault_fini(void)
|
|
|
{
|
|
|
- struct pfault_refbk refbk = {
|
|
|
- .refdiagc = 0x258,
|
|
|
- .reffcode = 1,
|
|
|
- .refdwlen = 5,
|
|
|
- .refversn = 2,
|
|
|
- };
|
|
|
|
|
|
if (pfault_disable)
|
|
|
return;
|
|
@@ -678,7 +682,7 @@ void pfault_fini(void)
|
|
|
" diag %0,0,0x258\n"
|
|
|
"0: nopr %%r7\n"
|
|
|
EX_TABLE(0b,0b)
|
|
|
- : : "a" (&refbk), "m" (refbk) : "cc");
|
|
|
+ : : "a" (&pfault_fini_refbk), "m" (pfault_fini_refbk) : "cc");
|
|
|
}
|
|
|
|
|
|
static DEFINE_SPINLOCK(pfault_lock);
|