-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 279792 b: refs/heads/master c: 0c9030d h: refs/heads/master v: v3
- Loading branch information
Leif Lindholm
authored and
Russell King
committed
Dec 13, 2011
1 parent
3c1c975
commit 3fa6350
Showing
4 changed files
with
94 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 9904f7933bd3b6aef880f7a91ddd8b19420ffd11 | ||
refs/heads/master: 0c9030deaf59d444f9e757ee73d6d81bfe2d3376 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
* arch/arm/include/asm/opcodes.h | ||
* | ||
* 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. | ||
*/ | ||
|
||
#ifndef __ASM_ARM_OPCODES_H | ||
#define __ASM_ARM_OPCODES_H | ||
|
||
#ifndef __ASSEMBLY__ | ||
extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); | ||
#endif | ||
|
||
#define ARM_OPCODE_CONDTEST_FAIL 0 | ||
#define ARM_OPCODE_CONDTEST_PASS 1 | ||
#define ARM_OPCODE_CONDTEST_UNCOND 2 | ||
|
||
#endif /* __ASM_ARM_OPCODES_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* linux/arch/arm/kernel/opcodes.c | ||
* | ||
* A32 condition code lookup feature moved from nwfpe/fpopcode.c | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <asm/opcodes.h> | ||
|
||
#define ARM_OPCODE_CONDITION_UNCOND 0xf | ||
|
||
/* | ||
* condition code lookup table | ||
* index into the table is test code: EQ, NE, ... LT, GT, AL, NV | ||
* | ||
* bit position in short is condition code: NZCV | ||
*/ | ||
static const unsigned short cc_map[16] = { | ||
0xF0F0, /* EQ == Z set */ | ||
0x0F0F, /* NE */ | ||
0xCCCC, /* CS == C set */ | ||
0x3333, /* CC */ | ||
0xFF00, /* MI == N set */ | ||
0x00FF, /* PL */ | ||
0xAAAA, /* VS == V set */ | ||
0x5555, /* VC */ | ||
0x0C0C, /* HI == C set && Z clear */ | ||
0xF3F3, /* LS == C clear || Z set */ | ||
0xAA55, /* GE == (N==V) */ | ||
0x55AA, /* LT == (N!=V) */ | ||
0x0A05, /* GT == (!Z && (N==V)) */ | ||
0xF5FA, /* LE == (Z || (N!=V)) */ | ||
0xFFFF, /* AL always */ | ||
0 /* NV */ | ||
}; | ||
|
||
/* | ||
* Returns: | ||
* ARM_OPCODE_CONDTEST_FAIL - if condition fails | ||
* ARM_OPCODE_CONDTEST_PASS - if condition passes (including AL) | ||
* ARM_OPCODE_CONDTEST_UNCOND - if NV condition, or separate unconditional | ||
* opcode space from v5 onwards | ||
* | ||
* Code that tests whether a conditional instruction would pass its condition | ||
* check should check that return value == ARM_OPCODE_CONDTEST_PASS. | ||
* | ||
* Code that tests if a condition means that the instruction would be executed | ||
* (regardless of conditional or unconditional) should instead check that the | ||
* return value != ARM_OPCODE_CONDTEST_FAIL. | ||
*/ | ||
asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr) | ||
{ | ||
u32 cc_bits = opcode >> 28; | ||
u32 psr_cond = psr >> 28; | ||
unsigned int ret; | ||
|
||
if (cc_bits != ARM_OPCODE_CONDITION_UNCOND) { | ||
if ((cc_map[cc_bits] >> (psr_cond)) & 1) | ||
ret = ARM_OPCODE_CONDTEST_PASS; | ||
else | ||
ret = ARM_OPCODE_CONDTEST_FAIL; | ||
} else { | ||
ret = ARM_OPCODE_CONDTEST_UNCOND; | ||
} | ||
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL_GPL(arm_check_condition); |