⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu_s.s

📁 MIPS下的boottloader yamon 的源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
 *  Return values :
 *  ---------------
 *
 *  None
 *
 ************************************************************************/
LEAF(sys_enable_int_mask)

    .set    noreorder

    MFC0(   v0, C0_STATUS)
    li	    t0, 1
    addiu   a0, C0_STATUS_IM_SHF
    sllv    t0, t0, a0
    or	    v0, t0
    MTC0(   v0, C0_STATUS)
    j       ra
    nop

    .set    reorder
END(sys_enable_int_mask)


/************************************************************************
 *
 *                          sys_disable_int_mask
 *  Description :
 *  -------------
 *
 *  Disable specific interrupt: set IM[x] bit in CP0-status.
 *  
 *  Return values :
 *  ---------------
 *
 *  None
 *
 ************************************************************************/
LEAF(sys_disable_int_mask)

    .set    noreorder

    MFC0(   v0, C0_STATUS)
    li	    t0, 1
    addiu   a0, C0_STATUS_IM_SHF
    sllv    t0, t0, a0
    li	    t1, 0xffffffff
    xor	    t0, t1
    and	    v0, t0
    MTC0(   v0, C0_STATUS)
    j       ra
    nop

    .set    reorder
END(sys_disable_int_mask)


/************************************************************************	
 *
 *                          sys_cpu_k0_config
 *  Description :
 *  -------------
 *
 *  Configure K0 field of CP0 CONFIG register
 *
 *  a0 holds the requested K0 setting
 *	
 *  Return values :
 *  ---------------
 *
 *  None
 *
 ************************************************************************/
LEAF( sys_cpu_k0_config )

	.set noreorder

	/* Reserve space on stack */
	addiu	sp, -8*4

	/* Store registers */
	sw	ra, 0(sp)
	sw	s0, 4(sp)
	sw	s1, 8(sp)	

	/* Copy registers to preserved registers */
	move	s0, a0

	/* Disable interrupts */
	MFC0(   s1, C0_STATUS )	
	li	t0, ~C0_STATUS_IE_MSK
	and	t0, s1
	MTC0(   t0, C0_STATUS )
		
	/* Flush D-Cache */
	addiu	sp, -4*4
	la      t0, sys_dcache_flush_all
	jal	t0
	nop
	addiu	sp, 4*4

	/* Shift to uncached */
	la	t0, sys_cpu_k0_config_uncached
	KSEG1A( t0)
	jr	t0
	nop

sys_cpu_k0_config_uncached :

	/* Set K0 field */
	sll	s0, C0_CONFIG_K0_SHF
	MFC0(   t1, C0_CONFIG )
	li	t0, ~C0_CONFIG_K0_MSK
	and	t1, t0
	or	t1, s0
	MTC0(   t1, C0_CONFIG )
	
	/* Restore CP0 STATUS */
	MTC0(   s1, C0_STATUS )

	/* Restore registers */
	lw	ra, 0(sp)
	lw	s0, 4(sp)
	lw	s1, 8(sp)

	jr	ra
	addiu	sp, 8*4
	
	.set reorder

END( sys_cpu_k0_config )
	


/******* Functions for access to CP0 registers ******/


	
/*------------------------------------------------------------------------------
 
 UINT32 CP0_index_read( void )
 
   Read CP0 index ($0) reister
 
------------------------------------------------------------------------------*/
LEAF(CP0_index_read)
    .set    noreorder

    MFC0(   v0,C0_INDEX)
    j       ra
    nop

    .set    reorder
END(CP0_index_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_random_read( void )
 
   Read CP0 random ($1) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_random_read)
    .set    noreorder

    MFC0(  v0,C0_RANDOM)
    j       ra
    nop

    .set    reorder
END(CP0_random_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_entrylo0_read( void )
 
   Read CP0 entrylo0 ($2) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_entrylo0_read)
    .set    noreorder

    MFC0(   v0,C0_ENTRYLO0)
    j       ra
    nop

    .set    reorder
END(CP0_entrylo0_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_entrylo1_read( void )
 
   Read CP0 entrylo1 ($3) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_entrylo1_read)
    .set    noreorder

    MFC0(   v0,C0_ENTRYLO1)
    j       ra
    nop

    .set    reorder
END(CP0_entrylo1_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_context_read( void )
 
   Read CP0 context ($4) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_context_read)
    .set    noreorder

    MFC0(   v0,C0_CONTEXT)
    j       ra
    nop

    .set    reorder
END(CP0_context_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_pagemask_read( void )
 
   Read CP0 pagemask ($5) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_pagemask_read)
    .set    noreorder

    MFC0(   v0,C0_PAGEMASK)
    j       ra
    nop

    .set    reorder
END(CP0_pagemask_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_wired_read( void )
 
   Read CP0 wired ($6) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_wired_read)
    .set    noreorder

    MFC0(   v0,C0_WIRED)
    j       ra
    nop

    .set    reorder
END(CP0_wired_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_badvaddr_read( void )
 
   Read CP0 badvaddr ($8) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_badvaddr_read)
    .set    noreorder

    MFC0(   v0,C0_BADVADDR)
    j       ra
    nop

    .set    reorder
END(CP0_badvaddr_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_count_read( void )
 
   Read CP0 count ($9) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_count_read)
    .set    noreorder

    MFC0(   v0,C0_COUNT)
    j       ra
    nop

    .set    reorder
END(CP0_count_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_entryhi_read( void )
 
   Read CP0 entryhi ($10) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_entryhi_read)
    .set    noreorder

    MFC0(   v0,C0_ENTRYHI)
    j       ra
    nop

    .set    reorder
END(CP0_entryhi_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_compare_read( void )
 
   Read CP0 compare ($11) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_compare_read)
    .set    noreorder

    MFC0(   v0,C0_COMPARE)
    j       ra
    nop

    .set    reorder
END(CP0_compare_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_status_read( void )
 
   Read CP0 status ($12) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_status_read)
    .set    noreorder

    MFC0(   v0,C0_STATUS)
    j       ra
    nop

    .set    reorder
END(CP0_status_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_cause_read( void )
 
   Read CP0 cause ($13) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_cause_read)
    .set    noreorder

    MFC0(   v0,C0_CAUSE)
    j       ra
    nop

    .set    reorder
END(CP0_cause_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_epc_read( void )
 
   Read CP0 epc ($14) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_epc_read)
    .set    noreorder

    MFC0(   v0,C0_EPC)
    j       ra
    nop

    .set    reorder
END(CP0_epc_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_prid_read( void )
 
   Read CP0 prid ($15) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_prid_read)
    .set    noreorder

    MFC0(   v0,C0_PRID)
    j       ra
    nop

    .set    reorder
END(CP0_prid_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_config_read( void )
 
   Read CP0 config ($16) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_config_read)
    .set    noreorder

    MFC0(   v0,C0_CONFIG)
    j       ra
    nop

    .set    reorder
END(CP0_config_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_config1_read( void )
 
   Read CP0 config1 ($16, select 1) register (MIPS32 only !!)
 
------------------------------------------------------------------------------*/
LEAF(CP0_config1_read)
    .set    noreorder

/*
       mfc0 v0,config,sel1: decodes to

 'sel'-bitfield  2-0 : select 1        =                                     001
      -bitfield 10-3 : fixed           =                           000 0000 0
 'rd' -bitfield 15-11: cp0 config (16) =                     1000 0
 'rt' -bitfield 20-16: cpu v0 (2)      =              0 0010
 'rs' -bitfield 25-21: rs = 'MF'       =        00 000
 'op' -bitfield 31-26: cop0            = 0100 00

       mfc0 v0,config,1                = 0100 0000 0000 0010 1000 0000 0000 0001

*/

    /* get config1 into v0 */
    .word       0x40028001
    nop
    nop
    j       ra
    nop

    .set    reorder
END(CP0_config1_read)


/*------------------------------------------------------------------------------
 
 UINT32 CP0_lladdr_read( void )
 
   Read CP0 lladdr ($17) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_lladdr_read)
    .set    noreorder

    MFC0(   v0,C0_LLADDR)
    j       ra
    nop

    .set    reorder
END(CP0_lladdr_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_watchlo_read( void )
 
   Read CP0 watchlo ($18) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_watchlo_read)
    .set    noreorder

    MFC0(   v0,C0_WATCHLO)
    j       ra
    nop

    .set    reorder
END(CP0_watchlo_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_watchhi_read( void )
 
   Read CP0 watchhi ($19) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_watchhi_read)
    .set    noreorder

    MFC0(   v0,C0_WATCHHI)
    j       ra
    nop

    .set    reorder
END(CP0_watchhi_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_debug_read( void )
 
   Read CP0 debug ($23) register (MIPS32 only !!)
 
------------------------------------------------------------------------------*/
LEAF(CP0_debug_read)
    .set    noreorder

    MFC0(   v0,C0_DEBUG)
    j       ra
    nop

    .set    reorder
END(CP0_debug_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_depc_read( void )
 
   Read CP0 depc ($24) register (MIPS32 only !!)
 
------------------------------------------------------------------------------*/
LEAF(CP0_depc_read)
    .set    noreorder

    MFC0(   v0,C0_DEPC)
    j       ra
    nop

    .set    reorder
END(CP0_depc_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_perfcount_read( void )
 
   Read CP0 perfcount ($25) register (MIPS32 only !!)
 
------------------------------------------------------------------------------*/
LEAF(CP0_perfcount_read)
    .set    noreorder

    MFC0(   v0,C0_PERFCNT)
    j       ra
    nop

    .set    reorder
END(CP0_perfcount_read)

/*------------------------------------------------------------------------------
 
 UINT32 CP0_ecc_read( void )
 
   Read CP0 ecc ($26) register
 
------------------------------------------------------------------------------*/
LEAF(CP0_ecc_read)
    .set    noreorder

    MFC0(   v0,C0_ERRCTL)
    j       ra
    nop

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -