svn commit: r212907 - in stable/8/sys/dev/aic7xxx: . aicasm

Justin T. Gibbs gibbs at FreeBSD.org
Mon Sep 20 17:39:50 UTC 2010


Author: gibbs
Date: Mon Sep 20 17:39:49 2010
New Revision: 212907
URL: http://svn.freebsd.org/changeset/base/212907

Log:
  MFC r210055:
  
  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.

Modified:
  stable/8/sys/dev/aic7xxx/aic79xx.reg
  stable/8/sys/dev/aic7xxx/aic7xxx.reg
  stable/8/sys/dev/aic7xxx/aicasm/aicasm_gram.y
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/aic7xxx/aic79xx.reg
==============================================================================
--- stable/8/sys/dev/aic7xxx/aic79xx.reg	Mon Sep 20 17:10:06 2010	(r212906)
+++ stable/8/sys/dev/aic7xxx/aic79xx.reg	Mon Sep 20 17:39:49 2010	(r212907)
@@ -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: stable/8/sys/dev/aic7xxx/aic7xxx.reg
==============================================================================
--- stable/8/sys/dev/aic7xxx/aic7xxx.reg	Mon Sep 20 17:10:06 2010	(r212906)
+++ stable/8/sys/dev/aic7xxx/aic7xxx.reg	Mon Sep 20 17:39:49 2010	(r212907)
@@ -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: stable/8/sys/dev/aic7xxx/aicasm/aicasm_gram.y
==============================================================================
--- stable/8/sys/dev/aic7xxx/aicasm/aicasm_gram.y	Mon Sep 20 17:10:06 2010	(r212906)
+++ stable/8/sys/dev/aic7xxx/aicasm/aicasm_gram.y	Mon Sep 20 17:39:49 2010	(r212907)
@@ -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 */
 	}


More information about the svn-src-all mailing list