📄 system.h
字号:
/*
* include/asm-cc/gcc/system.h
*
* Copyright (C) 2007/12/10 Wang Qiang
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* histroy:
* 2008/04/23, wang qiang, rurality@gmail.com
* 1) add the en_cpsr_irq, dis_cpsr_irq
* 2) modify en_spsr_irq, dis_cpsr_irq ,change r0 into %0,to save the context
* I found this problem under simlation envirment and report it to the gcc
* But I think is is not the gcc bug,It is my mistake
*
*/
#ifndef _SYSTEM_H_
#define _SYSTEM_H_
// flush the I-Cache
#define icache_clear \
__asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 0 " ::"r"(0) )
// flush the D-Cache
#define dcache_clear \
__asm__ __volatile__ ("mcr p15, 0, %0, c7, c6, 0 " ::"r"(0) )
// flush the I-Cache & D-Cache
#define cache_clear \
__asm__ __volatile__ ("mcr p15, 0, %0, c7, c7, 0 " ::"r"(0) )
#define iskernel() ({ \
register int __res; \
__asm__ __volatile__ ( \
"mrs %0,cpsr \n\t" \
"ands %0,%0,#0xF \n\t" \
"eorne %0,%0,#0xF \n\t" \
:"=r"(__res) \
); \
__res; \
})
#define isirq() ({ \
register int __res; \
__asm__ __volatile__ ( \
"mrs %0,cpsr \n\t" \
"and %0,%0,#0xF \n\t" \
"cmp %0, #0x1 \n\t" \
"movne %0, #0 \n\t" \
:"=r"(__res) \
); \
__res; \
})
#define en_spsr_irq() ({ \
register int __temp; \
__asm__ __volatile__ ( \
"mrs %0,spsr \n\t" \
"bic %0,%0,#0x80 \n\t" \
"msr spsr_c, %0 \n\t" \
:"=r"(__temp)); \
})
#define dis_spsr_irq() ({ \
register int __temp; \
__asm__ __volatile__ ( \
"mrs %0,spsr \n\t" \
"orr %0,%0,#0x80 \n\t" \
"msr spsr_c, %0 \n\t" \
:"=r"(__temp)); \
})
#define en_cpsr_irq() ({ \
register int __temp; \
__asm__ __volatile__ ( \
"mrs %0,cpsr \n\t" \
"bic %0,%0,#0x80 \n\t" \
"msr cpsr_c, %0 \n\t" \
:"=r"(__temp)); \
})
#define dis_cpsr_irq() ({ \
register int __temp; \
__asm__ __volatile__ ( \
"mrs %0,cpsr \n\t" \
"orr %0,%0,#0x80 \n\t" \
"msr cpsr_c, %0 \n\t" \
:"=r"(__temp)); \
})
//unsigned int do_div(unsigned int *n,unsigned int base)
//{
// unsigned int __res;
// switch(base) {
// case 8,16:
// power of 2 dividor is special
// *n = *n % 2^n remaider
// __res = *n/2^n dividend
// break;
// case 10:
// use the magic number 0xCCCCCCCD,to convert
// div into mul
// break;
// default:
// other return 35(Z)
// break;
// }
// return __res;
//}
#define do_div(n,base) ({ \
register unsigned int __res; \
register unsigned int reg0=0,reg1=0; \
__asm__ __volatile__( \
"cmp %4, #16 \n\t" \
"beq 16f \n\t" \
"cmp %4, #10 \n\t" \
"beq 10f \n\t" \
"cmp %4, #8 \n\t" \
"beq 8f \n\t" \
"b 0f \n\t" \
"8: \n\t" \
"and %0, %1, #7 \n\t" \
"mov %1, %1, asr #3 \n\t" \
"b 9999f \n\t" \
"10: \n\t" \
"ldr %2,=0xCCCCCCCD \n\t" \
"umull %0, %3, %2, %1 \n\t" \
"mov %2, %3, lsr #3 \n\t" \
"add %3, %2, %2, lsl #2 \n\t" \
"sub %0, %1, %3, lsl #1 \n\t" \
"mov %1, %2 \n\t" \
"b 9999f \n\t" \
"16: \n\t" \
"and %0, %1, #15 \n\t" \
"mov %1, %1, lsr #4 \n\t" \
"b 9999f \n\t" \
"0: \n\t" \
"mov %0, #35 \n\t" \
"mov %1, #0 \n\t" \
"9999: \n\t" \
:"=&r"(__res),"+&r"(*n) \
, "=r"(reg0),"=r"(reg1) \
: "r"(base) \
:"cc" \
); \
__res; \
})
#define bit_rotate(data,bit) ({ \
register unsigned int __mid=0; \
__asm__ __volatile__( \
"mov %3, %2, LSR %1 \n\t" \
"1:" \
"cmp %3, #0 \n\t" \
"beq 2f \n\t" \
"add %0, %0, #1 \n\t" \
"tst %3, #1 \n\t" \
"moveq %3, %3, LSR #1 \n\t" \
"beq 1b \n\t" \
"b 3f \n\t" \
"2:" \
"mov %0, #32 \n\t" \
"3:" \
: "=&r"(bit) \
: "0"(bit),"r"(data), "r"(__mid) \
: "cc" \
); \
bit; \
})
#endif // _SYSTEM_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -