Author: gibbs
Date: Wed Jul 14 14:31:18 2010
New Revision: 210055
URL: http://svn.freebsd.org/changeset/base/210055

Log:
  Correct logic bug in aicasm's undefined register bit access detection code.
  
  The code in question verifies that all register write operations only change
  bits that are defined (in the register definition file) for that effected
  register.  The bug effectively disabled this checking.
  
  o Fix the check by testing the opcode against all supported read ("and" based)
    operands.
  
  o Add missing bit definitions to the aic7xxx and aic79xx register definition
    files so that the warning (treated as a fatal error) does not spuriously
    fire.
  
  Reported by:  Pawel Worach <[email protected]>
  MFC after:    1 week

Modified:
  head/sys/dev/aic7xxx/aic79xx.reg
  head/sys/dev/aic7xxx/aic7xxx.reg
  head/sys/dev/aic7xxx/aicasm/aicasm_gram.y

Modified: head/sys/dev/aic7xxx/aic79xx.reg
==============================================================================
--- head/sys/dev/aic7xxx/aic79xx.reg    Wed Jul 14 13:31:27 2010        
(r210054)
+++ head/sys/dev/aic7xxx/aic79xx.reg    Wed Jul 14 14:31:18 2010        
(r210055)
@@ -3813,6 +3813,7 @@ scb {
        SCB_RESIDUAL_SGPTR {
                size    4
                field   SG_ADDR_MASK            0xf8    /* In the last byte */
+               field   SG_ADDR_BIT             0x04
                field   SG_OVERRUN_RESID        0x02    /* In the first byte */
                field   SG_LIST_NULL            0x01    /* In the first byte */
        }

Modified: head/sys/dev/aic7xxx/aic7xxx.reg
==============================================================================
--- head/sys/dev/aic7xxx/aic7xxx.reg    Wed Jul 14 13:31:27 2010        
(r210054)
+++ head/sys/dev/aic7xxx/aic7xxx.reg    Wed Jul 14 14:31:18 2010        
(r210055)
@@ -1448,6 +1448,7 @@ scratch_ram {
                mask    EXIT_MSG_LOOP           0x08
                mask    CONT_MSG_LOOP           0x04
                mask    CONT_TARG_SESSION       0x02
+               mask    SPARE                   0x01
                alias   RETURN_1
        }
        ARG_2 {

Modified: head/sys/dev/aic7xxx/aicasm/aicasm_gram.y
==============================================================================
--- head/sys/dev/aic7xxx/aicasm/aicasm_gram.y   Wed Jul 14 13:31:27 2010        
(r210054)
+++ head/sys/dev/aic7xxx/aicasm/aicasm_gram.y   Wed Jul 14 14:31:18 2010        
(r210055)
@@ -1821,9 +1821,15 @@ type_check(symbol_t *symbol, expression_
 {
        symbol_node_t *node;
        int and_op;
+       uint8_t invalid_bits;
 
        and_op = FALSE;
-       if (opcode == AIC_OP_AND || opcode == AIC_OP_JNZ || AIC_OP_JZ)
+       if (opcode == AIC_OP_AND
+        || opcode == AIC_OP_BMOV
+        || opcode == AIC_OP_JE
+        || opcode == AIC_OP_JNE
+        || opcode == AIC_OP_JNZ
+        || opcode == AIC_OP_JZ)
                and_op = TRUE;
 
        /*
@@ -1831,12 +1837,11 @@ type_check(symbol_t *symbol, expression_
         * that hasn't been defined.  If this is an and operation,
         * this is a mask, so "undefined" bits are okay.
         */
-       if (and_op == FALSE
-        && (expression->value & ~symbol->info.rinfo->valid_bitmask) != 0) {
+       invalid_bits = expression->value & ~symbol->info.rinfo->valid_bitmask;
+       if (and_op == FALSE && invalid_bits != 0) {
                snprintf(errbuf, sizeof(errbuf),
                         "Invalid bit(s) 0x%x in immediate written to %s",
-                        expression->value & ~symbol->info.rinfo->valid_bitmask,
-                        symbol->name);
+                        invalid_bits, symbol->name);
                stop(errbuf, EX_DATAERR);
                /* NOTREACHED */
        }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to