modified set_ipl() register constraints (code was overwriting input operand)
This commit is contained in:
@@ -8,7 +8,6 @@ inline uint32_t set_ipl(uint32_t ipl)
|
|||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" clr.l %[ret]\r\n" /* clear result (mvz.w sr is no valid statement) */
|
|
||||||
" move.w sr,%[ret]\r\n" /* retrieve status register */
|
" move.w sr,%[ret]\r\n" /* retrieve status register */
|
||||||
" andi.l #0x07,%[ipl]\n\t" /* mask out ipl bits on new value */
|
" andi.l #0x07,%[ipl]\n\t" /* mask out ipl bits on new value */
|
||||||
" lsl.l #8,%[ipl]\n\t" /* shift them to position */
|
" lsl.l #8,%[ipl]\n\t" /* shift them to position */
|
||||||
@@ -18,9 +17,9 @@ inline uint32_t set_ipl(uint32_t ipl)
|
|||||||
" move.w d0,sr\n\t" /* put it in place */
|
" move.w d0,sr\n\t" /* put it in place */
|
||||||
" andi.l #0x0700,%[ret]\r\n" /* mask out ipl bits */
|
" andi.l #0x0700,%[ret]\r\n" /* mask out ipl bits */
|
||||||
" lsr.l #8,%[ret]\r\n" /* shift them to position */
|
" lsr.l #8,%[ret]\r\n" /* shift them to position */
|
||||||
: [ret] "=d" (ret) /* output */
|
: [ret] "+g" (ret) /* output */
|
||||||
: [ipl] "r" (ipl) /* input */
|
: [ipl] "r" (ipl) /* input */
|
||||||
: "d0", "memory" /* clobber */
|
: "d0" /* clobber */
|
||||||
);
|
);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user