/** * msr_read - Read an MSR with error handling * @msr: MSR to read * @m: value to read into * * It returns read data only on success, otherwise it doesn't change the output * argument @m. * * Return: %0 for success, otherwise an error code
*/ staticint msr_read(u32 msr, struct msr *m)
{ int err;
u64 val;
err = rdmsrq_safe(msr, &val); if (!err)
m->q = val;
return err;
}
/** * msr_write - Write an MSR with error handling * * @msr: MSR to write * @m: value to write * * Return: %0 for success, otherwise an error code
*/ staticint msr_write(u32 msr, struct msr *m)
{ return wrmsrq_safe(msr, m->q);
}
staticinlineint __flip_bit(u32 msr, u8 bit, bool set)
{ struct msr m, m1; int err = -EINVAL;
if (bit > 63) return err;
err = msr_read(msr, &m); if (err) return err;
m1 = m; if (set)
m1.q |= BIT_64(bit); else
m1.q &= ~BIT_64(bit);
if (m1.q == m.q) return 0;
err = msr_write(msr, &m1); if (err) return err;
return 1;
}
/** * msr_set_bit - Set @bit in a MSR @msr. * @msr: MSR to write * @bit: bit number to set * * Return: * * < 0: An error was encountered. * * = 0: Bit was already set. * * > 0: Hardware accepted the MSR write.
*/ int msr_set_bit(u32 msr, u8 bit)
{ return __flip_bit(msr, bit, true);
}
EXPORT_SYMBOL_GPL(msr_set_bit);
/** * msr_clear_bit - Clear @bit in a MSR @msr. * @msr: MSR to write * @bit: bit number to clear * * Return: * * < 0: An error was encountered. * * = 0: Bit was already cleared. * * > 0: Hardware accepted the MSR write.
*/ int msr_clear_bit(u32 msr, u8 bit)
{ return __flip_bit(msr, bit, false);
}
EXPORT_SYMBOL_GPL(msr_clear_bit);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.