static int ofwd_strategy(void *devdata, int flag __unused, daddr_t dblk, size_t size, char *buf, size_t *rsize) { struct ofw_devdesc *dp = (struct ofw_devdesc *)devdata; daddr_t pos; int n; if (dp != kdp) { if (kdp != NULL) { #if !defined(__powerpc__) OF_close(kdp->d_handle); #endif kdp = NULL; } if ((dp->d_handle = OF_open(dp->d_path)) == -1) return (ENOENT); kdp = dp; } pos = dblk * 512; do { if (OF_seek(dp->d_handle, pos) < 0) return (EIO); n = OF_read(dp->d_handle, buf, size); if (n < 0 && n != -2) return (EIO); } while (n == -2); *rsize = size; return (0); }
static int strategy(void *devdata, int rw, daddr32_t blk, size_t size, void *buf, size_t *rsize) { struct of_dev *dev = devdata; u_quad_t pos; int n; if (rw != F_READ) return EPERM; if (dev->type != OFDEV_DISK) panic("strategy"); DNPRINTF(BOOT_D_OFDEV, "strategy: block %lx, partition offset %lx, " "blksz %lx\n", (long)blk, (long)dev->partoff, (long)dev->bsize); DNPRINTF(BOOT_D_OFDEV, "strategy: seek position should be: %lx\n", (long)((blk + dev->partoff) * dev->bsize)); pos = (u_quad_t)(blk + dev->partoff) * dev->bsize; for (;;) { DNPRINTF(BOOT_D_OFDEV, "strategy: seeking to %lx\n", (long)pos); if (OF_seek(dev->handle, pos) < 0) break; DNPRINTF(BOOT_D_OFDEV, "strategy: reading %lx at %p\n", (long)size, buf); n = OF_read(dev->handle, buf, size); if (n == -2) continue; if (n < 0) break; *rsize = n; return 0; } return EIO; }
static int ofw_cngetc(struct consdev *cp) { unsigned char ch; if (OF_read(stdin, &ch, 1) > 0) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) int kdb_brk; if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { switch (kdb_brk) { case KDB_REQ_DEBUGGER: kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); break; case KDB_REQ_PANIC: kdb_panic("Panic sequence on console"); break; case KDB_REQ_REBOOT: kdb_reboot(); break; } } #endif return (ch); } return (-1); }
static int strategy(void *devdata, int rw, daddr32_t blk, size_t size, void *buf, size_t *rsize) { struct of_dev *dev = devdata; u_quad_t pos; int n; if (rw != F_READ) return EPERM; if (dev->type != OFDEV_DISK) panic("strategy"); pos = (u_quad_t)(blk + dev->partoff) * dev->bsize; for (;;) { if (OF_seek(dev->handle, pos) < 0) break; n = OF_read(dev->handle, buf, size); if (n == -2) continue; if (n < 0) break; *rsize = n; return 0; } return EIO; }
int getchar(void) { unsigned char ch = '\0'; int l; while ((l = OF_read(stdin, &ch, 1)) != 1) if (l != -2 && l != 0) return -1; return ch; }
static int ofwbootcons_cngetc(dev_t dev) { unsigned char ch = '\0'; int l; while ((l = OF_read(stdin, &ch, 1)) != 1) if (l != -2 && l != 0) return -1; return ch; }
static int openfirmware_getchar(void) { unsigned char ch = '\0'; int l; while ((l = OF_read(prom_stdin(), &ch, 1)) != 1) if (l != -2 && l != 0) return -1; return ch; }
static int ofw_cons_checkc(dev_t dev) { unsigned char ch; if (OF_read(stdin, &ch, 1) > 0) { return (ch); } return (-1); }
/* * Bootstrap console keyboard routines, using OpenFirmware I/O. */ int ofkbd_cngetc(dev_t dev) { u_char c = '\0'; int len; do { len = OF_read(ofkbd_ihandle, &c, 1); } while (len != 1); return c; }
int hfs_read(struct open_file *f, void *start, size_t size, size_t *resid) { int len; len = OF_read(OF_fd, start, size); if (len == -1) return EIO; size -= len; if (resid) *resid = size; return 0; }
static int ofw_cngetc(struct consdev *cp) { unsigned char ch; if (OF_read(stdin, &ch, 1) > 0) { #if defined(KDB) kdb_alt_break(ch, &alt_break_state); #endif return (ch); } return (-1); }
static int ofwn_get(struct iodesc *desc, void *pkt, size_t len, time_t timeout) { time_t t; int length; #if defined(NETIF_DEBUG) printf("netif_get: pkt=%p, maxlen=%d, timeout=%d\n", pkt, len, timeout); #endif t = getsecs(); do { length = OF_read(netinstance, pkt, len); } while ((length == -2 || length == 0) && (getsecs() - t < timeout)); #if defined(NETIF_DEBUG) printf("netif_get: received length=%d (%x)\n", length, length); #endif if (length < 12) return -1; #if defined(NETIF_VERBOSE_DEBUG) { char *ch = pkt; int i; for(i = 0; i < 96; i += 4) { printf("%02x%02x%02x%02x ", ch[i], ch[i+1], ch[i+2], ch[i+3]); } printf("\n"); } #endif #if defined(NETIF_DEBUG) { struct ether_header *eh = pkt; printf("dst: %s ", ether_sprintf(eh->ether_dhost)); printf("src: %s ", ether_sprintf(eh->ether_shost)); printf("type: 0x%x\n", eh->ether_type & 0xffff); } #endif return length; }
int ofw_cons_poll() { unsigned char ch; if (saved_char != -1) return 1; if (OF_read(stdin, &ch, 1) > 0) { saved_char = ch; return 1; } return 0; }
static int ofw_cons_getc(dev_t dev) { unsigned char ch; int l; ch = '\0'; while ((l = OF_read(stdin, &ch, 1)) != 1) { if (l != -2 && l != 0) { return (-1); } } return (ch); }
int ofw_cons_getchar() { unsigned char ch = '\0'; int l; if (saved_char != -1) { l = saved_char; saved_char = -1; return l; } while ((l = OF_read(stdin, &ch, 1)) != 1) if (l != -2 && l != 0) return -1; return ch; }
int ofw_cons_getchar() { unsigned char ch = '\0'; int l; if (saved_char != -1) { l = saved_char; saved_char = -1; return l; } if (OF_read(stdin, &ch, 1) > 0) return (ch); return (-1); }
static int ofwd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, char *buf, size_t *rsize) { struct ofw_devdesc *dp = (struct ofw_devdesc *)devdata; unsigned long pos; int n; int i, j; pos = dblk * 512; do { if (OF_seek(dp->d_handle, pos) < 0) return EIO; n = OF_read(dp->d_handle, buf, size); if (n < 0 && n != -2) return EIO; } while (n == -2); *rsize = size; return 0; }
/* * Receive a packet, including the ether header. * Return the total length received (or -1 on error). */ ssize_t netif_get(struct iodesc *desc, void *pkt, size_t maxlen, time_t timo) { struct of_dev *op; int tick0, tmo_ms; int len; op = desc->io_netif->nif_devdata; #ifdef NETIF_DEBUG printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n", pkt, maxlen, timo); #endif tmo_ms = timo * 1000; tick0 = OF_milliseconds(); do { len = OF_read(op->handle, pkt, maxlen); } while ((len == -2 || len == 0) && ((OF_milliseconds() - tick0) < tmo_ms)); #ifdef NETIF_DEBUG printf("netif_get: received len=%d\n", len); #endif if (len < 12) return -1; #ifdef NETIF_DEBUG { struct ether_header *eh = pkt; printf("dst: %s ", ether_sprintf(eh->ether_dhost)); printf("src: %s ", ether_sprintf(eh->ether_shost)); printf("type: 0x%x\n", eh->ether_type & 0xFFFF); } #endif return len; }
int strategy(void *devdata, int rw, daddr32_t blk, size_t size, void *buf, size_t *rsize) { struct of_dev *dev = devdata; u_quad_t pos; int n; if (rw != F_READ) return EPERM; #ifdef SOFTRAID /* Intercept strategy for softraid volumes. */ if (dev->type == OFDEV_SOFTRAID) return sr_strategy(bootdev_dip->sr_vol, rw, blk, size, buf, rsize); #endif if (dev->type != OFDEV_DISK) panic("strategy"); DNPRINTF(BOOT_D_OFDEV, "strategy: block %lx, partition offset %lx, " "blksz %lx\n", (long)blk, (long)dev->partoff, (long)dev->bsize); DNPRINTF(BOOT_D_OFDEV, "strategy: seek position should be: %lx\n", (long)((blk + dev->partoff) * dev->bsize)); pos = (u_quad_t)(blk + dev->partoff) * dev->bsize; for (;;) { DNPRINTF(BOOT_D_OFDEV, "strategy: seeking to %lx\n", (long)pos); if (OF_seek(dev->handle, pos) < 0) break; DNPRINTF(BOOT_D_OFDEV, "strategy: reading %lx at %p\n", (long)size, buf); n = OF_read(dev->handle, buf, size); if (n == -2) continue; if (n < 0) break; *rsize = n; return 0; } return EIO; }
int prom_cngetc(dev_t dev) { unsigned char ch = '\0'; int l; #ifdef DDB static int nplus = 0; #endif while ((l = OF_read(stdin, &ch, 1)) != 1) /* void */; #ifdef DDB if (ch == '+') { if (nplus++ > 3) Debugger(); } else nplus = 0; #endif if (ch == '\r') ch = '\n'; if (ch == '\b') ch = '\177'; return ch; }
static void ofnet_read(struct ofnet_softc *of) { struct ifnet *ifp = &of->sc_ethercom.ec_if; struct mbuf *m, **mp, *head; int s, l, len; char *bufp; s = splnet(); #if NIPKDB_OFN > 0 ipkdbrint(kifp, ifp); #endif for (;;) { len = OF_read(of->sc_ihandle, buf, sizeof buf); if (len == -2 || len == 0) break; if (len < sizeof(struct ether_header)) { ifp->if_ierrors++; continue; } bufp = buf; /* * We don't know if the interface included the FCS * or not. For now, assume that it did if we got * a packet length that looks like it could include * the FCS. * * XXX Yuck. */ if (len > ETHER_MAX_LEN - ETHER_CRC_LEN) len = ETHER_MAX_LEN - ETHER_CRC_LEN; /* Allocate a header mbuf */ MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == 0) { ifp->if_ierrors++; continue; } m->m_pkthdr.rcvif = ifp; m->m_pkthdr.len = len; l = MHLEN; head = 0; mp = &head; while (len > 0) { if (head) { MGET(m, M_DONTWAIT, MT_DATA); if (m == 0) { ifp->if_ierrors++; m_freem(head); head = 0; break; } l = MLEN; } if (len >= MINCLSIZE) { MCLGET(m, M_DONTWAIT); if ((m->m_flags & M_EXT) == 0) { ifp->if_ierrors++; m_free(m); m_freem(head); head = 0; break; } l = MCLBYTES; } /* * Make sure the data after the Ethernet header * is aligned. * * XXX Assumes the device is an ethernet, but * XXX then so does other code in this driver. */ if (head == NULL) { char *newdata = (char *)ALIGN(m->m_data + sizeof(struct ether_header)) - sizeof(struct ether_header); l -= newdata - m->m_data; m->m_data = newdata; } m->m_len = l = min(len, l); bcopy(bufp, mtod(m, char *), l); bufp += l; len -= l; *mp = m; mp = &m->m_next; } if (head == 0) continue; #if NBPFILTER > 0 if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m); #endif ifp->if_ipackets++; (*ifp->if_input)(ifp, head); } splx(s); }