162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright IBM Corp. 2008
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Authors: Hollis Blanchard <hollisb@us.ibm.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __ASM_PPC_DISASSEMBLE_H__
1062306a36Sopenharmony_ci#define __ASM_PPC_DISASSEMBLE_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic inline unsigned int get_op(u32 inst)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	return inst >> 26;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic inline unsigned int get_xop(u32 inst)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	return (inst >> 1) & 0x3ff;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline unsigned int get_sprn(u32 inst)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic inline unsigned int get_dcrn(u32 inst)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline unsigned int get_tmrn(u32 inst)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic inline unsigned int get_rt(u32 inst)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	return (inst >> 21) & 0x1f;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline unsigned int get_rs(u32 inst)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	return (inst >> 21) & 0x1f;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic inline unsigned int get_ra(u32 inst)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	return (inst >> 16) & 0x1f;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline unsigned int get_rb(u32 inst)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return (inst >> 11) & 0x1f;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic inline unsigned int get_rc(u32 inst)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	return inst & 0x1;
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic inline unsigned int get_ws(u32 inst)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	return (inst >> 11) & 0x1f;
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic inline unsigned int get_d(u32 inst)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	return inst & 0xffff;
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic inline unsigned int get_oc(u32 inst)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	return (inst >> 11) & 0x7fff;
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic inline unsigned int get_tx_or_sx(u32 inst)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	return (inst) & 0x1;
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define IS_XFORM(inst)	(get_op(inst)  == 31)
8562306a36Sopenharmony_ci#define IS_DSFORM(inst)	(get_op(inst) >= 56)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/*
8862306a36Sopenharmony_ci * Create a DSISR value from the instruction
8962306a36Sopenharmony_ci */
9062306a36Sopenharmony_cistatic inline unsigned make_dsisr(unsigned instr)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	unsigned dsisr;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	/* bits  6:15 --> 22:31 */
9662306a36Sopenharmony_ci	dsisr = (instr & 0x03ff0000) >> 16;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	if (IS_XFORM(instr)) {
9962306a36Sopenharmony_ci		/* bits 29:30 --> 15:16 */
10062306a36Sopenharmony_ci		dsisr |= (instr & 0x00000006) << 14;
10162306a36Sopenharmony_ci		/* bit     25 -->    17 */
10262306a36Sopenharmony_ci		dsisr |= (instr & 0x00000040) << 8;
10362306a36Sopenharmony_ci		/* bits 21:24 --> 18:21 */
10462306a36Sopenharmony_ci		dsisr |= (instr & 0x00000780) << 3;
10562306a36Sopenharmony_ci	} else {
10662306a36Sopenharmony_ci		/* bit      5 -->    17 */
10762306a36Sopenharmony_ci		dsisr |= (instr & 0x04000000) >> 12;
10862306a36Sopenharmony_ci		/* bits  1: 4 --> 18:21 */
10962306a36Sopenharmony_ci		dsisr |= (instr & 0x78000000) >> 17;
11062306a36Sopenharmony_ci		/* bits 30:31 --> 12:13 */
11162306a36Sopenharmony_ci		if (IS_DSFORM(instr))
11262306a36Sopenharmony_ci			dsisr |= (instr & 0x00000003) << 18;
11362306a36Sopenharmony_ci	}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	return dsisr;
11662306a36Sopenharmony_ci}
11762306a36Sopenharmony_ci#endif /* __ASM_PPC_DISASSEMBLE_H__ */
118