/* * Lowest level routines for all ColdFire processors. Based on the * MCF523x examples from Freescale. * * Freescale explicitly grants the redistribution and modification * of these source files. The complete licensing information is * available in the file LICENSE_FREESCALE.TXT. * * Modifications Copyright (c) 2006 Christian Walter * * File: $Id: mcf5xxx.S,v 1.2 2006/09/24 22:50:22 wolti Exp $ */ .global asm_set_ipl .global _asm_set_ipl .global mcf5xxx_wr_cacr .global _mcf5xxx_wr_cacr .global mcf5xxx_wr_acr0 .global _mcf5xxx_wr_acr0 .global mcf5xxx_wr_acr1 .global _mcf5xxx_wr_acr1 .global mcf5xxx_wr_acr2 .global _mcf5xxx_wr_acr2 .global mcf5xxx_wr_acr3 .global _mcf5xxx_wr_acr3 .global mcf5xxx_wr_other_sp .global _mcf5xxx_wr_other_sp .global mcf5xxx_wr_other_a7 .global _mcf5xxx_wr_other_a7 .global mcf5xxx_wr_vbr .global _mcf5xxx_wr_vbr .global mcf5xxx_wr_macsr .global _mcf5xxx_wr_macsr .global mcf5xxx_wr_mask .global _mcf5xxx_wr_mask .global mcf5xxx_wr_acc0 .global _mcf5xxx_wr_acc0 .global mcf5xxx_wr_accext01 .global _mcf5xxx_wr_accext01 .global mcf5xxx_wr_accext23 .global _mcf5xxx_wr_accext23 .global mcf5xxx_wr_acc1 .global _mcf5xxx_wr_acc1 .global mcf5xxx_wr_acc2 .global _mcf5xxx_wr_acc2 .global mcf5xxx_wr_acc3 .global _mcf5xxx_wr_acc3 .global mcf5xxx_wr_sr .global _mcf5xxx_wr_sr .global mcf5xxx_wr_rambar0 .global _mcf5xxx_wr_rambar0 .global mcf5xxx_wr_rambar1 .global _mcf5xxx_wr_rambar1 .global mcf5xxx_wr_mbar .global _mcf5xxx_wr_mbar .global mcf5xxx_wr_mbar0 .global _mcf5xxx_wr_mbar0 .global mcf5xxx_wr_mbar1 .global _mcf5xxx_wr_mbar1 .text /********************************************************************/ /* * This routines changes the IPL to the value passed into the routine. * It also returns the old IPL value back. * Calling convention from C: * old_ipl = asm_set_ipl(new_ipl); * For the Diab Data C compiler, it passes return value thru D0. * Note that only the least significant three bits of the passed * value are used. */ asm_set_ipl: _asm_set_ipl: link a6,#-8 movem.l d6-d7,(sp) move.w sr,d7 /* current sr */ move.l d7,d0 /* prepare return value */ andi.l #0x0700,d0 /* mask out IPL */ lsr.l #8,d0 /* IPL */ move.l 8(a6),d6 /* get argument */ andi.l #0x07,d6 /* least significant three bits */ lsl.l #8,d6 /* move over to make mask */ andi.l #0x0000F8FF,d7 /* zero out current IPL */ or.l d6,d7 /* place new IPL in sr */ move.w d7,sr movem.l (sp),d6-d7 lea 8(sp),sp unlk a6 rts /********************************************************************/ /* * These routines write to the special purpose registers in the ColdFire * core. Since these registers are write-only in the supervisor model, * no corresponding read routines exist. */ mcf5xxx_wr_cacr: _mcf5xxx_wr_cacr: move.l 4(sp),d0 .long 0x4e7b0002 /* movec d0,cacr */ nop rts mcf5xxx_wr_acr0: _mcf5xxx_wr_acr0: move.l 4(sp),d0 .long 0x4e7b0004 /* movec d0,ACR0 */ nop rts mcf5xxx_wr_acr1: _mcf5xxx_wr_acr1: move.l 4(sp),d0 .long 0x4e7b0005 /* movec d0,ACR1 */ nop rts mcf5xxx_wr_acr2: _mcf5xxx_wr_acr2: move.l 4(sp),d0 .long 0x4e7b0006 /* movec d0,ACR2 */ nop rts mcf5xxx_wr_acr3: _mcf5xxx_wr_acr3: move.l 4(sp),d0 .long 0x4e7b0007 /* movec d0,ACR3 */ nop rts mcf5xxx_wr_other_sp: _mcf5xxx_wr_other_sp: mcf5xxx_wr_other_a7: _mcf5xxx_wr_other_a7: move.l 4(sp),d0 .long 0x4e7b0800 /* movec d0,OTHER_A7 */ nop rts mcf5xxx_wr_vbr: _mcf5xxx_wr_vbr: move.l 4(sp),d0 .long 0x4e7b0801 /* movec d0,VBR */ nop rts mcf5xxx_wr_macsr: _mcf5xxx_wr_macsr: move.l 4(sp),d0 .long 0x4e7b0804 /* movec d0,MACSR */ nop rts mcf5xxx_wr_mask: _mcf5xxx_wr_mask: move.l 4(sp),d0 .long 0x4e7b0805 /* movec d0,MASK */ nop rts mcf5xxx_wr_acc0: _mcf5xxx_wr_acc0: move.l 4(sp),d0 .long 0x4e7b0806 /* movec d0,ACC0 */ nop rts mcf5xxx_wr_accext01: _mcf5xxx_wr_accext01: move.l 4(sp),d0 .long 0x4e7b0807 /* movec d0,ACCEXT01 */ nop rts mcf5xxx_wr_accext23: _mcf5xxx_wr_accext23: move.l 4(sp),d0 .long 0x4e7b0808 /* movec d0,ACCEXT23 */ nop rts mcf5xxx_wr_acc1: _mcf5xxx_wr_acc1: move.l 4(sp),d0 .long 0x4e7b0809 /* movec d0,ACC1 */ nop rts mcf5xxx_wr_acc2: _mcf5xxx_wr_acc2: move.l 4(sp),d0 .long 0x4e7b080A /* movec d0,ACC2 */ nop rts mcf5xxx_wr_acc3: _mcf5xxx_wr_acc3: move.l 4(sp),d0 .long 0x4e7b080B /* movec d0,ACC3 */ nop rts mcf5xxx_wr_sr: _mcf5xxx_wr_sr: move.l 4(sp),d0 move.w d0,SR rts mcf5xxx_wr_rambar0: _mcf5xxx_wr_rambar0: move.l 4(sp),d0 .long 0x4e7b0C04 /* movec d0,RAMBAR0 */ nop rts mcf5xxx_wr_rambar1: _mcf5xxx_wr_rambar1: move.l 4(sp),d0 .long 0x4e7b0C05 /* movec d0,RAMBAR1 */ nop rts mcf5xxx_wr_mbar: _mcf5xxx_wr_mbar: mcf5xxx_wr_mbar0: _mcf5xxx_wr_mbar0: move.l 4(sp),d0 .long 0x4e7b0C0F /* movec d0,MBAR0 */ nop rts mcf5xxx_wr_mbar1: _mcf5xxx_wr_mbar1: move.l 4(sp),d0 .long 0x4e7b0C0E /* movec d0,MBAR1 */ nop rts .end /********************************************************************/