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-stable-8
mailing list