* bset/bclr on the same memory address. Sigh. Either turn off optimisation
* (-O1 without -Os works), or we do it the dumb way.
*/
- *(u8*)addr |= mask;
- // asm volatile (
- // "ldx %0\n"
- // "bset 00,x,%1"
- // : /* outputs */
- // : "p" (addr), "g" (mask) /* inputs */
- // : "x" /* altered registers */
- // );
+ //*(u8*)addr |= mask;
+ asm volatile (
+ "ldx %0\n"
+ "bset 00,x,%1\n"
+ : "=m" (addr) /* outputs */
+ : "g" (mask) /* inputs */
+ : "x" /* altered registers */
+ );
}
extern inline void bclr(const void* addr, const u8 mask) {
/* same issue as above */
- *(u8*)addr &= ~mask;
- // asm volatile (
- // "ldx %0\n"
- // "bclr 00,x,%1"
- // : /* outputs */
- // : "p" (addr), "g" (mask) /* inputs */
- // : "x" /* altered registers */
- // );
+ //*(u8*)addr &= ~mask;
+ asm volatile (
+ "ldx %0\n"
+ "bclr 00,x,%1\n"
+ : "=m" (addr) /* outputs */
+ : "g" (mask) /* inputs */
+ : "x" /* altered registers */
+ );
}
extern inline void lock() {
- asm volatile ("cli");
+ asm volatile ("sei");
}
extern inline void unlock() {
- asm volatile ("sei");
+ asm volatile ("cli");
}
#endif /* _ASM_H_ */