Skip to content

Commit

Permalink
map asm! ops to unimplemented! on non ARM targets
Browse files Browse the repository at this point in the history
  • Loading branch information
japaric committed Dec 23, 2017
1 parent 9a80bae commit 875ee38
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 191 deletions.
73 changes: 26 additions & 47 deletions src/asm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,74 +7,57 @@
/// cause an exception
#[inline(always)]
pub fn bkpt() {
#[cfg(target_arch = "arm")]
unsafe {
asm!("bkpt"
:
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => unsafe { asm!("bkpt" :::: "volatile") },
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}

/// A no-operation. Useful to prevent delay loops from being optimized away.
#[inline(always)]
#[inline]
pub fn nop() {
unsafe {
asm!("nop"
:
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => unsafe { asm!("nop" :::: "volatile") },
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}
/// Wait For Event
#[inline(always)]
#[inline]
pub fn wfe() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("wfe"
:
:
:
: "volatile")
},
() => unsafe { asm!("wfe" :::: "volatile") },
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

/// Wait For Interrupt
#[inline(always)]
#[inline]
pub fn wfi() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe{
asm!("wfi"
:
:
:
: "volatile")
},
() => unsafe { asm!("wfi" :::: "volatile") },
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

/// Instruction Synchronization Barrier
///
/// Flushes the pipeline in the processor, so that all instructions following the `ISB` are fetched
/// from cache or memory, after the instruction has been completed.
#[inline(always)]
#[inline]
pub fn isb() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("isb 0xF" : : : "memory" : "volatile");
},
() => unsafe { asm!("isb 0xF" : : : "memory" : "volatile") },
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

Expand All @@ -86,15 +69,13 @@ pub fn isb() {
///
/// * any explicit memory access made before this instruction is complete
/// * all cache and branch predictor maintenance operations before this instruction complete
#[inline(always)]
#[inline]
pub fn dsb() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("dsb 0xF" : : : "memory" : "volatile");
},
() => unsafe { asm!("dsb 0xF" : : : "memory" : "volatile") },
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

Expand All @@ -103,14 +84,12 @@ pub fn dsb() {
/// Ensures that all explicit memory accesses that appear in program order before the `DMB`
/// instruction are observed before any explicit memory accesses that appear in program order
/// after the `DMB` instruction.
#[inline(always)]
#[inline]
pub fn dmb() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("dmb 0xF" : : : "memory" : "volatile");
},
() => unsafe { asm!("dmb 0xF" : : : "memory" : "volatile") },
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}
22 changes: 6 additions & 16 deletions src/interrupt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,15 @@
pub use bare_metal::{CriticalSection, Mutex, Nr};

/// Disables all interrupts
#[inline(always)]
#[inline]
pub fn disable() {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("cpsid i"
:
:
: "memory"
: "volatile");
asm!("cpsid i" ::: "memory" : "volatile");
},
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

Expand All @@ -24,19 +20,13 @@ pub fn disable() {
/// # Safety
///
/// - Do not call this function inside an `interrupt::free` critical section
#[inline(always)]
#[inline]
pub unsafe fn enable() {
match () {
#[cfg(target_arch = "arm")]
() => {
asm!("cpsie i"
:
:
: "memory"
: "volatile");
}
() => asm!("cpsie i" ::: "memory" : "volatile"),
#[cfg(not(target_arch = "arm"))]
() => {}
() => unimplemented!(),
}
}

Expand Down
21 changes: 12 additions & 9 deletions src/register/apsr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,18 @@ impl Apsr {
}

/// Reads the CPU register
#[inline(always)]
#[inline]
pub fn read() -> Apsr {
let r: u32;
unsafe {
asm!("mrs $0, APSR"
: "=r"(r)
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => {
let r: u32;
unsafe {
asm!("mrs $0, APSR" : "=r"(r) ::: "volatile");
}
Apsr { bits: r }
}
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
Apsr { bits: r }
}
36 changes: 20 additions & 16 deletions src/register/basepri.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
//! Base Priority Mask Register
/// Reads the CPU register
#[inline(always)]
#[inline]
pub fn read() -> u8 {
let r: u32;
unsafe {
asm!("mrs $0, BASEPRI"
: "=r"(r)
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => {
let r: u32;
unsafe {
asm!("mrs $0, BASEPRI" : "=r"(r) ::: "volatile");
}
r as u8
}
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
r as u8
}

/// Writes to the CPU register
#[inline(always)]
pub unsafe fn write(basepri: u8) {
asm!("msr BASEPRI, $0"
:
: "r"(basepri)
: "memory"
: "volatile");
#[inline]
pub unsafe fn write(_basepri: u8) {
match () {
#[cfg(target_arch = "arm")]
() => asm!("msr BASEPRI, $0" :: "r"(_basepri) : "memory" : "volatile"),
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}
17 changes: 9 additions & 8 deletions src/register/basepri_max.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
///
/// - `basepri != 0` AND `basepri::read() == 0`, OR
/// - `basepri != 0` AND `basepri < basepri::read()`
#[inline(always)]
pub fn write(basepri: u8) {
unsafe {
asm!("msr BASEPRI_MAX, $0"
:
: "r"(basepri)
: "memory"
: "volatile");
#[inline]
pub fn write(_basepri: u8) {
match () {
#[cfg(target_arch = "arm")]
() => unsafe {
asm!("msr BASEPRI_MAX, $0" :: "r"(_basepri) : "memory" : "volatile");
},
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}
19 changes: 10 additions & 9 deletions src/register/control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,16 @@ impl Fpca {
}

/// Reads the CPU register
#[inline(always)]
#[inline]
pub fn read() -> Control {
let r: u32;
unsafe {
asm!("mrs $0, CONTROL"
: "=r"(r)
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => {
let r: u32;
unsafe { asm!("mrs $0, CONTROL" : "=r"(r) ::: "volatile") }
Control { bits: r }
}
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
Control { bits: r }
}
27 changes: 14 additions & 13 deletions src/register/faultmask.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,20 @@ impl Faultmask {
}

/// Reads the CPU register
#[inline(always)]
#[inline]
pub fn read() -> Faultmask {
let r: u32;
unsafe {
asm!("mrs $0, FAULTMASK"
: "=r"(r)
:
:
: "volatile");
}
if r & (1 << 0) == (1 << 0) {
Faultmask::Inactive
} else {
Faultmask::Active
match () {
#[cfg(target_arch = "arm")]
() => {
let r: u32;
unsafe { asm!("mrs $0, FAULTMASK" : "=r"(r) ::: "volatile") }
if r & (1 << 0) == (1 << 0) {
Faultmask::Inactive
} else {
Faultmask::Active
}
}
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}
33 changes: 18 additions & 15 deletions src/register/lr.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
//! Link register
/// Reads the CPU register
#[inline(always)]
#[inline]
pub fn read() -> u32 {
let r: u32;
unsafe {
asm!("mov $0,R14"
: "=r"(r)
:
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => {
let r: u32;
unsafe { asm!("mov $0,R14" : "=r"(r) ::: "volatile") }
r
}
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
r
}

/// Writes `bits` to the CPU register
#[inline(always)]
#[cfg_attr(not(target_arch = "arm"), allow(unused_variables))]
#[inline]
pub unsafe fn write(bits: u32) {
asm!("mov R14,$0"
:
: "r"(bits)
:
: "volatile");
match () {
#[cfg(target_arch = "arm")]
() => asm!("mov R14,$0" :: "r"(bits) :: "volatile"),
#[cfg(not(target_arch = "arm"))]
() => unimplemented!(),
}
}
Loading

0 comments on commit 875ee38

Please sign in to comment.