You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: armv8m.rs
    path of file: ./repos/probe-rs/probe-rs/src/architecture/arm/core/exception_handling
    
    the code of the file until where you have to start completion: use crate::{
    core::{ExceptionInfo, ExceptionInterface},
    debug::DebugRegisters,
    memory::MemoryInterface,
    memory_mapped_bitfield_register, Error, MemoryMappedRegister, RegisterValue,
};
use bitfield::bitfield;

use super::armv6m_armv7m_shared::{Xpsr, EXCEPTION_STACK_REGISTERS};

bitfield! {
    /// The EXC_RETURN value (The value of the link address register) is used to
    /// determine the stack to return to when returning from an exception.
    struct ExcReturn(u32);
    /// If the value is 0xFF, then this is a valid EXC_RETURN value.
    is_exception_flag, _: 31, 24;
    /// Indicates whet
    
    fn usage_fault_description(&self) -> Result<Option<String>, Error> {
        let source = if self.uf_coprocessor() {
            "Coprocessor access error"
        } else if self.uf_div_by_zero() {
            "Division by zero"
        } else if self.uf_integrity_check() {
            "Integrity check error"
        } else if self.uf_invalid_state() {
            "Instruction executed with invalid EPSR.T or EPSR.IT field"
        } else if self.uf_unaligned_access() {
            "Unaligned access"
        } else if self.uf_undefined_instruction() {
            "Undefined instruction"
        } else {
            // Not a UsageFault.
            return Ok(None);
        };
        Ok(Some(format!("UsageFault ({source})")))
    }