linux/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h
<<
>>
Prefs
   1/*
   2 * Instruction formats for the sequencer program downloaded to
   3 * Aic7xxx SCSI host adapters
   4 *
   5 * Copyright (c) 1997, 1998, 2000 Justin T. Gibbs.
   6 * All rights reserved.
   7 *
   8 * Redistribution and use in source and binary forms, with or without
   9 * modification, are permitted provided that the following conditions
  10 * are met:
  11 * 1. Redistributions of source code must retain the above copyright
  12 *    notice, this list of conditions, and the following disclaimer,
  13 *    without modification.
  14 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  15 *    substantially similar to the "NO WARRANTY" disclaimer below
  16 *    ("Disclaimer") and any redistribution must be conditioned upon
  17 *    including a substantially similar Disclaimer requirement for further
  18 *    binary redistribution.
  19 * 3. Neither the names of the above-listed copyright holders nor the names
  20 *    of any contributors may be used to endorse or promote products derived
  21 *    from this software without specific prior written permission.
  22 *
  23 * Alternatively, this software may be distributed under the terms of the
  24 * GNU General Public License ("GPL") version 2 as published by the Free
  25 * Software Foundation.
  26 *
  27 * NO WARRANTY
  28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  32 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38 * POSSIBILITY OF SUCH DAMAGES.
  39 *
  40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#12 $
  41 *
  42 * $FreeBSD$
  43 */
  44
  45#include <asm/byteorder.h>
  46
  47/* 8bit ALU logic operations */
  48struct ins_format1 {
  49#ifdef __LITTLE_ENDIAN
  50        uint32_t        immediate       : 8,
  51                        source          : 9,
  52                        destination     : 9,
  53                        ret             : 1,
  54                        opcode          : 4,
  55                        parity          : 1;
  56#else
  57        uint32_t        parity          : 1,
  58                        opcode          : 4,
  59                        ret             : 1,
  60                        destination     : 9,
  61                        source          : 9,
  62                        immediate       : 8;
  63#endif
  64};
  65
  66/* 8bit ALU shift/rotate operations */
  67struct ins_format2 {
  68#ifdef __LITTLE_ENDIAN
  69        uint32_t        shift_control   : 8,
  70                        source          : 9,
  71                        destination     : 9,
  72                        ret             : 1,
  73                        opcode          : 4,
  74                        parity          : 1;
  75#else
  76        uint32_t        parity          : 1,
  77                        opcode          : 4,
  78                        ret             : 1,
  79                        destination     : 9,
  80                        source          : 9,
  81                        shift_control   : 8;
  82#endif
  83};
  84
  85/* 8bit branch control operations */
  86struct ins_format3 {
  87#ifdef __LITTLE_ENDIAN
  88        uint32_t        immediate       : 8,
  89                        source          : 9,
  90                        address         : 10,
  91                        opcode          : 4,
  92                        parity          : 1;
  93#else
  94        uint32_t        parity          : 1,
  95                        opcode          : 4,
  96                        address         : 10,
  97                        source          : 9,
  98                        immediate       : 8;
  99#endif
 100};
 101
 102/* 16bit ALU logic operations */
 103struct ins_format4 {
 104#ifdef __LITTLE_ENDIAN
 105        uint32_t        opcode_ext      : 8,
 106                        source          : 9,
 107                        destination     : 9,
 108                        ret             : 1,
 109                        opcode          : 4,
 110                        parity          : 1;
 111#else
 112        uint32_t        parity          : 1,
 113                        opcode          : 4,
 114                        ret             : 1,
 115                        destination     : 9,
 116                        source          : 9,
 117                        opcode_ext      : 8;
 118#endif
 119};
 120
 121/* 16bit branch control operations */
 122struct ins_format5 {
 123#ifdef __LITTLE_ENDIAN
 124        uint32_t        opcode_ext      : 8,
 125                        source          : 9,
 126                        address         : 10,
 127                        opcode          : 4,
 128                        parity          : 1;
 129#else
 130        uint32_t        parity          : 1,
 131                        opcode          : 4,
 132                        address         : 10,
 133                        source          : 9,
 134                        opcode_ext      : 8;
 135#endif
 136};
 137
 138/*  Far branch operations */
 139struct ins_format6 {
 140#ifdef __LITTLE_ENDIAN
 141        uint32_t        page            : 3,
 142                        opcode_ext      : 5,
 143                        source          : 9,
 144                        address         : 10,
 145                        opcode          : 4,
 146                        parity          : 1;
 147#else
 148        uint32_t        parity          : 1,
 149                        opcode          : 4,
 150                        address         : 10,
 151                        source          : 9,
 152                        opcode_ext      : 5,
 153                        page            : 3;
 154#endif
 155};
 156
 157union ins_formats {
 158                struct ins_format1 format1;
 159                struct ins_format2 format2;
 160                struct ins_format3 format3;
 161                struct ins_format4 format4;
 162                struct ins_format5 format5;
 163                struct ins_format6 format6;
 164                uint8_t            bytes[4];
 165                uint32_t           integer;
 166};
 167struct instruction {
 168        union   ins_formats format;
 169        u_int   srcline;
 170        struct symbol *patch_label;
 171        STAILQ_ENTRY(instruction) links;
 172};
 173
 174#define AIC_OP_OR       0x0
 175#define AIC_OP_AND      0x1
 176#define AIC_OP_XOR      0x2
 177#define AIC_OP_ADD      0x3
 178#define AIC_OP_ADC      0x4
 179#define AIC_OP_ROL      0x5
 180#define AIC_OP_BMOV     0x6
 181
 182#define AIC_OP_MVI16    0x7
 183
 184#define AIC_OP_JMP      0x8
 185#define AIC_OP_JC       0x9
 186#define AIC_OP_JNC      0xa
 187#define AIC_OP_CALL     0xb
 188#define AIC_OP_JNE      0xc
 189#define AIC_OP_JNZ      0xd
 190#define AIC_OP_JE       0xe
 191#define AIC_OP_JZ       0xf
 192
 193/* Pseudo Ops */
 194#define AIC_OP_SHL      0x10
 195#define AIC_OP_SHR      0x20
 196#define AIC_OP_ROR      0x30
 197
 198/* 16bit Ops. Low byte main opcode.  High byte extended opcode. */ 
 199#define AIC_OP_OR16     0x8005
 200#define AIC_OP_AND16    0x8105
 201#define AIC_OP_XOR16    0x8205
 202#define AIC_OP_ADD16    0x8305
 203#define AIC_OP_ADC16    0x8405
 204#define AIC_OP_JNE16    0x8805
 205#define AIC_OP_JNZ16    0x8905
 206#define AIC_OP_JE16     0x8C05
 207#define AIC_OP_JZ16     0x8B05
 208#define AIC_OP_JMP16    0x9005
 209#define AIC_OP_JC16     0x9105
 210#define AIC_OP_JNC16    0x9205
 211#define AIC_OP_CALL16   0x9305
 212#define AIC_OP_CALL16   0x9305
 213
 214/* Page extension is low three bits of second opcode byte. */
 215#define AIC_OP_JMPF     0xA005
 216#define AIC_OP_CALLF    0xB005
 217#define AIC_OP_JCF      0xC005
 218#define AIC_OP_JNCF     0xD005
 219#define AIC_OP_CMPXCHG  0xE005
 220