Here is a hack to remove the 20 or so warning messages from if_ie.c Most of them are due to the supply of volatile pointers to bcopy and bzero. I do the following to produce macros that call bzero and bcopy, but don't produce warning messages when called with volatile arguments. typedef void Xcopy( void volatile *, void volatile *, int); #define VBCOPY(A,B,L) (*(Xcopy *)&bcopy)((A),(B),(L)) typedef void Xzero( void volatile *, int); #define VBZERO(A,L) (*(Xzero *)&bzero)((A),(L)) This is kind-of a hack but a couple of things come to mind: 1/ Most drivers should probably use volatile mor ethan they do if they share structures with hardware. These often need bcopy(), so this is probably not an unlikely combination.. 2/ initializing these volatile structures with bzero is also not unlikely. 3/ It probably wouldn't hurt if bzero ALWAYS had a volatile pointer argument. and it may remove several warnings in other drivers as well. questions: Is this hack to horrible to contemplate? Is it a reasonable thing thing to define bzero to take a volatile argument. (It does not hurt to pass a nonvolatile argument to a volatile but the reverse produces an error message). I've compiled LINT with this change and it compiles fine. Should we define an "official" volatile_bcopy() to use in these cases, even if it is just a (nicer) version of this hack in systm.h? BTW what is ovbcopy() for? is it for overlaping? I can't find a definition for it here, but google finds references in true64. (overlapping) I notice that KAME ar the major users of it, and it's defined to be the same as bcopy.. I also notice that NetBSD are (or were) having a kill ovbcopy/bcopy/bzero effort to replace them with memcpy and friends.
--- if_ie.c Thu Sep 6 17:05:12 2001 +++ if_ie.c.new Thu Sep 6 17:03:42 2001 @@ -62,6 +62,10 @@ * Intel EtherExpress 16 support from if_ix.c, written by Rodney W. Grimes. */ +typedef void Xcopy( void volatile *, void volatile *, int); +#define VBCOPY(A,B,L) (*(Xcopy *)&bcopy)((A),(B),(L)) +typedef void Xzero( void volatile *, int); +#define VBZERO(A,L) (*(Xzero *)&bzero)((A),(L)) /* * The i82586 is a very versatile chip, found in many implementations. * Programming this chip is mostly the same, but certain details differ @@ -219,9 +223,10 @@ /* * This tells the autoconf code how to set us up. */ +static char drivername[] = "ie"; struct isa_driver iedriver = { INTR_TYPE_NET, - ieprobe, ieattach, "ie" + ieprobe, ieattach, drivername }; enum ie_hardware { @@ -776,7 +781,7 @@ ifp->if_softc = ie; ifp->if_unit = unit; - ifp->if_name = iedriver.name; + ifp->if_name = drivername; ifp->if_mtu = ETHERMTU; printf("ie%d: <%s R%d> address %6D\n", unit, ie_hardware_names[ie->hard_type], @@ -1140,7 +1145,7 @@ /* * Snarf the Ethernet header. */ - bcopy((v_caddr_t) ie->cbuffs[i], (caddr_t) ehp, sizeof *ehp); + VBCOPY(ie->cbuffs[i], (caddr_t) ehp, sizeof *ehp); /* ignore cast-qual warning here */ /* @@ -1228,7 +1233,7 @@ if (thislen > m->m_len - thismboff) { int newlen = m->m_len - thismboff; - bcopy((v_caddr_t) (ie->cbuffs[head] + offset), + VBCOPY((v_caddr_t) (ie->cbuffs[head] + offset), mtod(m, v_caddr_t) +thismboff, (unsigned) newlen); /* ignore cast-qual warning */ m = m->m_next; @@ -1245,7 +1250,7 @@ * pointers, and so on. */ if (thislen < m->m_len - thismboff) { - bcopy((v_caddr_t) (ie->cbuffs[head] + offset), + VBCOPY((v_caddr_t) (ie->cbuffs[head] + offset), mtod(m, caddr_t) +thismboff, (unsigned) thislen); thismboff += thislen; /* we are this far into the * mbuf */ @@ -1257,7 +1262,7 @@ * buffer's contents into the current mbuf. Do the * combination of the above actions. */ - bcopy((v_caddr_t) (ie->cbuffs[head] + offset), + VBCOPY((v_caddr_t) (ie->cbuffs[head] + offset), mtod(m, caddr_t) + thismboff, (unsigned) thislen); m = m->m_next; thismboff = 0; /* new mbuf, start at the beginning */ @@ -1300,7 +1305,7 @@ struct mbuf *m = 0; struct ether_header eh; - bcopy((v_caddr_t) (ie->rframes[num]), &rfd, + VBCOPY((v_caddr_t) (ie->rframes[num]), &rfd, sizeof(struct ie_recv_frame_desc)); /* @@ -1400,12 +1405,11 @@ len = 0; for (m0 = m; m && len < IE_BUF_LEN; m = m->m_next) { - bcopy(mtod(m, caddr_t), buffer, m->m_len); + VBCOPY(mtod(m, caddr_t), buffer, m->m_len); buffer += m->m_len; len += m->m_len; } - m_freem(m0); len = max(len, ETHER_MIN_LEN); /* @@ -1413,9 +1417,9 @@ * packet before we commit it to the wire. */ if (ie->arpcom.ac_if.if_bpf) - bpf_tap(&ie->arpcom.ac_if, - (void *)ie->xmit_cbuffs[ie->xmit_count], len); + bpf_mtap(&ie->arpcom.ac_if, m0); + m_freem(m0); ie->xmit_buffs[ie->xmit_count]->ie_xmit_flags = IE_XMIT_LAST|len; ie->xmit_buffs[ie->xmit_count]->ie_xmit_next = 0xffff; @@ -1468,7 +1472,7 @@ scp = (volatile struct ie_sys_conf_ptr *) (uintptr_t) (realbase + IE_SCP_ADDR); - bzero((volatile char *) scp, sizeof *scp); + VBZERO(scp, sizeof *scp); /* * First we put the ISCP at the bottom of memory; this tests to make @@ -1477,10 +1481,10 @@ * operation. */ iscp = (volatile struct ie_int_sys_conf_ptr *) where; - bzero((volatile char *)iscp, sizeof *iscp); + VBZERO(iscp, sizeof *iscp); scb = (volatile struct ie_sys_ctl_block *) where; - bzero((volatile char *)scb, sizeof *scb); + VBZERO(scb, sizeof *scb); scp->ie_bus_use = ie_softc[unit].bus_use; /* 8-bit or 16-bit */ scp->ie_iscp_ptr = (caddr_t) (uintptr_t) @@ -1505,7 +1509,7 @@ iscp = (void *) Align((caddr_t) (uintptr_t) (realbase + IE_SCP_ADDR - sizeof(struct ie_int_sys_conf_ptr))); - bzero((volatile char *) iscp, sizeof *iscp); /* ignore cast-qual */ + VBZERO(iscp, sizeof *iscp); /* ignore cast-qual */ scp->ie_iscp_ptr = (caddr_t) (uintptr_t) ((volatile char *) iscp - (volatile char *) (uintptr_t) realbase); @@ -1750,7 +1754,7 @@ command_and_wait(int unit, int cmd, volatile void *pcmd, int mask) { volatile struct ie_cmd_common *cc = pcmd; - volatile int timedout = 0; + int timedout = 0; struct callout_handle ch; ie_softc[unit].scb->ie_command = (u_short) cmd; @@ -1863,7 +1867,7 @@ /* First lay them out */ for (i = 0; i < ie->nframes; i++) { ie->rframes[i] = rfd; - bzero((volatile char *) rfd, sizeof *rfd); /* ignore cast-qual */ + VBZERO( rfd, sizeof *rfd); /* ignore cast-qual */ rfd++; } @@ -1887,7 +1891,7 @@ for (i = 0; i < ie->nrxbufs; i++) { ie->rbuffs[i] = rbd; - bzero((volatile char *)rbd, sizeof *rbd); + VBZERO(rbd, sizeof *rbd); ptr = Alignvol(ptr + sizeof *rbd); rbd->ie_rbd_length = IE_RBUF_SIZE; rbd->ie_rbd_buffer = MK_24(MEM, ptr); @@ -1937,7 +1941,7 @@ cmd->com.ie_cmd_link = 0xffff; /* ignore cast-qual */ - bcopy((v_caddr_t) ie->mcast_addrs, (v_caddr_t) cmd->ie_mcast_addrs, + VBCOPY(ie->mcast_addrs, cmd->ie_mcast_addrs, ie->mcast_count * sizeof *ie->mcast_addrs); cmd->ie_mcast_bytes = ie->mcast_count * 6; /* grrr... */ @@ -2001,8 +2005,8 @@ cmd->com.ie_cmd_cmd = IE_CMD_IASETUP | IE_CMD_LAST; cmd->com.ie_cmd_link = 0xffff; - bcopy((volatile char *)ie_softc[unit].arpcom.ac_enaddr, - (volatile char *)&cmd->ie_address, sizeof cmd->ie_address); + VBCOPY(ie_softc[unit].arpcom.ac_enaddr, + &cmd->ie_address, sizeof cmd->ie_address); scb->ie_command_list = MK_16(MEM, cmd); if (command_and_wait(unit, IE_CU_START, cmd, IE_STAT_COMPL) || !(cmd->com.ie_cmd_status & IE_STAT_OK)) { @@ -2051,8 +2055,8 @@ ie->xmit_cbuffs[ie->ntxbufs - 1] = (volatile void *) ptr; for (i = 1; i < ie->ntxbufs; i++) { - bzero((v_caddr_t) ie->xmit_cmds[i], sizeof *ie->xmit_cmds[i]); - bzero((v_caddr_t) ie->xmit_buffs[i], sizeof *ie->xmit_buffs[i]); + VBZERO(ie->xmit_cmds[i], sizeof *ie->xmit_cmds[i]); + VBZERO(ie->xmit_buffs[i], sizeof *ie->xmit_buffs[i]); } /*