Line 1... |
Line 1... |
/* s390-dis.c -- Disassemble S390 instructions
|
/* s390-dis.c -- Disassemble S390 instructions
|
Copyright 2000, 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
Copyright 2000, 2001, 2002, 2003, 2005, 2007, 2008
|
|
Free Software Foundation, Inc.
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
|
|
This file is part of the GNU opcodes library.
|
This file is part of the GNU opcodes library.
|
|
|
This library is free software; you can redistribute it and/or modify
|
This library is free software; you can redistribute it and/or modify
|
Line 21... |
Line 22... |
|
|
#include <stdio.h>
|
#include <stdio.h>
|
#include "ansidecl.h"
|
#include "ansidecl.h"
|
#include "sysdep.h"
|
#include "sysdep.h"
|
#include "dis-asm.h"
|
#include "dis-asm.h"
|
|
#include "opintl.h"
|
#include "opcode/s390.h"
|
#include "opcode/s390.h"
|
|
|
static int init_flag = 0;
|
static int init_flag = 0;
|
static int opc_index[256];
|
static int opc_index[256];
|
static int current_arch_mask = 0;
|
static int current_arch_mask = 0;
|
Line 34... |
Line 36... |
static void
|
static void
|
init_disasm (struct disassemble_info *info)
|
init_disasm (struct disassemble_info *info)
|
{
|
{
|
const struct s390_opcode *opcode;
|
const struct s390_opcode *opcode;
|
const struct s390_opcode *opcode_end;
|
const struct s390_opcode *opcode_end;
|
|
const char *p;
|
|
|
memset (opc_index, 0, sizeof (opc_index));
|
memset (opc_index, 0, sizeof (opc_index));
|
opcode_end = s390_opcodes + s390_num_opcodes;
|
opcode_end = s390_opcodes + s390_num_opcodes;
|
for (opcode = s390_opcodes; opcode < opcode_end; opcode++)
|
for (opcode = s390_opcodes; opcode < opcode_end; opcode++)
|
{
|
{
|
opc_index[(int) opcode->opcode[0]] = opcode - s390_opcodes;
|
opc_index[(int) opcode->opcode[0]] = opcode - s390_opcodes;
|
while ((opcode < opcode_end) &&
|
while ((opcode < opcode_end) &&
|
(opcode[1].opcode[0] == opcode->opcode[0]))
|
(opcode[1].opcode[0] == opcode->opcode[0]))
|
opcode++;
|
opcode++;
|
}
|
}
|
|
|
|
for (p = info->disassembler_options; p != NULL; )
|
|
{
|
|
if (CONST_STRNEQ (p, "esa"))
|
|
current_arch_mask = 1 << S390_OPCODE_ESA;
|
|
else if (CONST_STRNEQ (p, "zarch"))
|
|
current_arch_mask = 1 << S390_OPCODE_ZARCH;
|
|
else
|
|
fprintf (stderr, "Unknown S/390 disassembler option: %s\n", p);
|
|
|
|
p = strchr (p, ',');
|
|
if (p != NULL)
|
|
p++;
|
|
}
|
|
|
|
if (!current_arch_mask)
|
switch (info->mach)
|
switch (info->mach)
|
{
|
{
|
case bfd_mach_s390_31:
|
case bfd_mach_s390_31:
|
current_arch_mask = 1 << S390_OPCODE_ESA;
|
current_arch_mask = 1 << S390_OPCODE_ESA;
|
break;
|
break;
|
Line 55... |
Line 74... |
current_arch_mask = 1 << S390_OPCODE_ZARCH;
|
current_arch_mask = 1 << S390_OPCODE_ZARCH;
|
break;
|
break;
|
default:
|
default:
|
abort ();
|
abort ();
|
}
|
}
|
|
|
init_flag = 1;
|
init_flag = 1;
|
}
|
}
|
|
|
/* Extracts an operand value from an instruction. */
|
/* Extracts an operand value from an instruction. */
|
|
|
Line 249... |
Line 269... |
(*info->fprintf_func) (info->stream, ".byte\t0x%02x", value);
|
(*info->fprintf_func) (info->stream, ".byte\t0x%02x", value);
|
return 1;
|
return 1;
|
}
|
}
|
}
|
}
|
|
|
No newline at end of file
|
No newline at end of file
|
|
void
|
|
print_s390_disassembler_options (FILE *stream)
|
|
{
|
|
fprintf (stream, _("\n\
|
|
The following S/390 specific disassembler options are supported for use\n\
|
|
with the -M switch (multiple options should be separated by commas):\n"));
|
|
|
|
fprintf (stream, _(" esa Disassemble in ESA architecture mode\n"));
|
|
fprintf (stream, _(" zarch Disassemble in z/Architecture mode\n"));
|
|
}
|
|
|
No newline at end of file
|
No newline at end of file
|