void mbuf_queue_init(struct mhdr *mhdr) { STAILQ_INIT(mhdr); }
static int smu_attach(device_t dev) { struct smu_softc *sc; phandle_t node, child; uint8_t data[12]; sc = device_get_softc(dev); mtx_init(&sc->sc_mtx, "smu", NULL, MTX_DEF); sc->sc_cur_cmd = NULL; sc->sc_doorbellirqid = -1; sc->sc_u3 = 0; if (OF_finddevice("/u3") != -1) sc->sc_u3 = 1; /* * Map the mailbox area. This should be determined from firmware, * but I have not found a simple way to do that. */ bus_dma_tag_create(NULL, 16, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, PAGE_SIZE, 1, PAGE_SIZE, 0, NULL, NULL, &(sc->sc_dmatag)); sc->sc_bt = &bs_le_tag; bus_space_map(sc->sc_bt, SMU_MAILBOX, 4, 0, &sc->sc_mailbox); /* * Allocate the command buffer. This can be anywhere in the low 4 GB * of memory. */ bus_dmamem_alloc(sc->sc_dmatag, (void **)&sc->sc_cmd, BUS_DMA_WAITOK | BUS_DMA_ZERO, &sc->sc_cmd_dmamap); bus_dmamap_load(sc->sc_dmatag, sc->sc_cmd_dmamap, sc->sc_cmd, PAGE_SIZE, smu_phys_callback, sc, 0); STAILQ_INIT(&sc->sc_cmdq); /* * Set up handlers to change CPU voltage when CPU frequency is changed. */ EVENTHANDLER_REGISTER(cpufreq_pre_change, smu_cpufreq_pre_change, dev, EVENTHANDLER_PRI_ANY); EVENTHANDLER_REGISTER(cpufreq_post_change, smu_cpufreq_post_change, dev, EVENTHANDLER_PRI_ANY); node = ofw_bus_get_node(dev); /* Some SMUs have RPM and PWM controlled fans which do not sit * under the same node. So we have to attach them separately. */ smu_attach_fans(dev, node); /* * Now detect and attach the other child devices. */ for (child = OF_child(node); child != 0; child = OF_peer(child)) { char name[32]; memset(name, 0, sizeof(name)); OF_getprop(child, "name", name, sizeof(name)); if (strncmp(name, "sensors", 8) == 0) smu_attach_sensors(dev, child); if (strncmp(name, "smu-i2c-control", 15) == 0) smu_attach_i2c(dev, child); } /* Some SMUs have the I2C children directly under the bus. */ smu_attach_i2c(dev, node); /* * Collect calibration constants. */ smu_get_datablock(dev, SMU_CPUTEMP_CAL, data, sizeof(data)); sc->sc_cpu_diode_scale = (data[4] << 8) + data[5]; sc->sc_cpu_diode_offset = (data[6] << 8) + data[7]; smu_get_datablock(dev, SMU_CPUVOLT_CAL, data, sizeof(data)); sc->sc_cpu_volt_scale = (data[4] << 8) + data[5]; sc->sc_cpu_volt_offset = (data[6] << 8) + data[7]; sc->sc_cpu_curr_scale = (data[8] << 8) + data[9]; sc->sc_cpu_curr_offset = (data[10] << 8) + data[11]; smu_get_datablock(dev, SMU_SLOTPW_CAL, data, sizeof(data)); sc->sc_slots_pow_scale = (data[4] << 8) + data[5]; sc->sc_slots_pow_offset = (data[6] << 8) + data[7]; /* * Set up LED interface */ sc->sc_leddev = led_create(smu_set_sleepled, dev, "sleepled"); /* * Reset on power loss behavior */ SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "server_mode", CTLTYPE_INT | CTLFLAG_RW, dev, 0, smu_server_mode, "I", "Enable reboot after power failure"); /* * Set up doorbell interrupt. */ sc->sc_doorbellirqid = 0; sc->sc_doorbellirq = bus_alloc_resource_any(smu_doorbell, SYS_RES_IRQ, &sc->sc_doorbellirqid, RF_ACTIVE); bus_setup_intr(smu_doorbell, sc->sc_doorbellirq, INTR_TYPE_MISC | INTR_MPSAFE, NULL, smu_doorbell_intr, dev, &sc->sc_doorbellirqcookie); powerpc_config_intr(rman_get_start(sc->sc_doorbellirq), INTR_TRIGGER_EDGE, INTR_POLARITY_LOW); /* * Connect RTC interface. */ clock_register(dev, 1000); /* * Learn about shutdown events */ EVENTHANDLER_REGISTER(shutdown_final, smu_shutdown, dev, SHUTDOWN_PRI_LAST); return (bus_generic_attach(dev)); }
void pccard_check_cis_quirks(device_t dev) { struct pccard_softc *sc = PCCARD_SOFTC(dev); int wiped = 0; int i, j; struct pccard_function *pf, *pf_next, *pf_last; struct pccard_config_entry *cfe, *cfe_next; struct pccard_cis_quirk *q; pf = NULL; pf_last = NULL; for (i=0; i<n_pccard_cis_quirks; i++) { q = &pccard_cis_quirks[i]; if (!pccard_cis_quirk_match(sc, q)) continue; if (!wiped) { if (bootverbose) { device_printf(dev, "using CIS quirks for "); for (j = 0; j < 4; j++) { if (sc->card.cis1_info[j] == NULL) break; if (j) kprintf(", "); kprintf("%s", sc->card.cis1_info[j]); } kprintf("\n"); } for (pf = STAILQ_FIRST(&sc->card.pf_head); pf != NULL; pf = pf_next) { for (cfe = STAILQ_FIRST(&pf->cfe_head); cfe != NULL; cfe = cfe_next) { cfe_next = STAILQ_NEXT(cfe, cfe_list); kfree(cfe, M_DEVBUF); } pf_next = STAILQ_NEXT(pf, pf_list); kfree(pf, M_DEVBUF); } STAILQ_INIT(&sc->card.pf_head); wiped = 1; } if (pf_last == q->pf) { cfe = kmalloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT); if (cfe == NULL) { device_printf(dev, "no memory for quirk (1)\n"); continue; } *cfe = *q->cfe; STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list); } else { pf = kmalloc(sizeof(*pf), M_DEVBUF, M_NOWAIT); if (pf == NULL) { device_printf(dev, "no memory for pccard function\n"); continue; } *pf = *q->pf; STAILQ_INIT(&pf->cfe_head); cfe = kmalloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT); if (cfe == NULL) { kfree(pf, M_DEVBUF); device_printf(dev, "no memory for quirk (2)\n"); continue; } *cfe = *q->cfe; STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list); STAILQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list); pf_last = q->pf; } } }
static void fwe_init(void *arg) { struct fwe_softc *fwe = ((struct fwe_eth_softc *)arg)->fwe; struct firewire_comm *fc; struct ifnet *ifp = fwe->eth_softc.ifp; struct fw_xferq *xferq; struct fw_xfer *xfer; struct mbuf *m; int i; FWEDEBUG(ifp, "initializing\n"); /* XXX keep promiscoud mode */ ifp->if_flags |= IFF_PROMISC; fc = fwe->fd.fc; if (fwe->dma_ch < 0) { fwe->dma_ch = fw_open_isodma(fc, /* tx */0); if (fwe->dma_ch < 0) return; xferq = fc->ir[fwe->dma_ch]; xferq->flag |= FWXFERQ_EXTBUF | FWXFERQ_HANDLER | FWXFERQ_STREAM; fwe->stream_ch = stream_ch; fwe->pkt_hdr.mode.stream.chtag = fwe->stream_ch; xferq->flag &= ~0xff; xferq->flag |= fwe->stream_ch & 0xff; /* register fwe_input handler */ xferq->sc = (caddr_t) fwe; xferq->hand = fwe_as_input; xferq->bnchunk = rx_queue_len; xferq->bnpacket = 1; xferq->psize = MCLBYTES; xferq->queued = 0; xferq->buf = NULL; xferq->bulkxfer = (struct fw_bulkxfer *) malloc( sizeof(struct fw_bulkxfer) * xferq->bnchunk, M_FWE, M_WAITOK); if (xferq->bulkxfer == NULL) { printf("if_fwe: malloc failed\n"); return; } STAILQ_INIT(&xferq->stvalid); STAILQ_INIT(&xferq->stfree); STAILQ_INIT(&xferq->stdma); xferq->stproc = NULL; for (i = 0; i < xferq->bnchunk; i ++) { m = m_getcl(M_WAIT, MT_DATA, M_PKTHDR); xferq->bulkxfer[i].mbuf = m; m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; STAILQ_INSERT_TAIL(&xferq->stfree, &xferq->bulkxfer[i], link); } STAILQ_INIT(&fwe->xferlist); for (i = 0; i < TX_MAX_QUEUE; i++) { xfer = fw_xfer_alloc(M_FWE); if (xfer == NULL) break; xfer->send.spd = tx_speed; xfer->fc = fwe->fd.fc; xfer->sc = (caddr_t)fwe; xfer->hand = fwe_output_callback; STAILQ_INSERT_TAIL(&fwe->xferlist, xfer, link); } } else xferq = fc->ir[fwe->dma_ch]; /* start dma */ if ((xferq->flag & FWXFERQ_RUNNING) == 0) fc->irx_enable(fc, fwe->dma_ch); #if defined(__FreeBSD__) ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; #else ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; #endif #if 0 /* attempt to start output */ fwe_start(ifp); #endif }
static void ntb_transport_init_queue(struct ntb_transport_ctx *nt, unsigned int qp_num) { struct ntb_transport_mw *mw; struct ntb_transport_qp *qp; vm_paddr_t mw_base; uint64_t mw_size, qp_offset; size_t tx_size; unsigned num_qps_mw, mw_num, mw_count; mw_count = nt->mw_count; mw_num = QP_TO_MW(nt, qp_num); mw = &nt->mw_vec[mw_num]; qp = &nt->qp_vec[qp_num]; qp->qp_num = qp_num; qp->transport = nt; qp->ntb = nt->ntb; qp->client_ready = false; qp->event_handler = NULL; ntb_qp_link_down_reset(qp); if (nt->qp_count % mw_count && mw_num + 1 < nt->qp_count / mw_count) num_qps_mw = nt->qp_count / mw_count + 1; else num_qps_mw = nt->qp_count / mw_count; mw_base = mw->phys_addr; mw_size = mw->phys_size; tx_size = mw_size / num_qps_mw; qp_offset = tx_size * (qp_num / mw_count); qp->tx_mw = mw->vbase + qp_offset; KASSERT(qp->tx_mw != NULL, ("uh oh?")); /* XXX Assumes that a vm_paddr_t is equivalent to bus_addr_t */ qp->tx_mw_phys = mw_base + qp_offset; KASSERT(qp->tx_mw_phys != 0, ("uh oh?")); tx_size -= sizeof(struct ntb_rx_info); qp->rx_info = (void *)(qp->tx_mw + tx_size); /* Due to house-keeping, there must be at least 2 buffs */ qp->tx_max_frame = qmin(tx_size / 2, transport_mtu + sizeof(struct ntb_payload_header)); qp->tx_max_entry = tx_size / qp->tx_max_frame; callout_init(&qp->link_work, 0); callout_init(&qp->queue_full, 1); callout_init(&qp->rx_full, 1); mtx_init(&qp->ntb_rx_q_lock, "ntb rx q", NULL, MTX_SPIN); mtx_init(&qp->ntb_tx_free_q_lock, "ntb tx free q", NULL, MTX_SPIN); TASK_INIT(&qp->rx_completion_task, 0, ntb_complete_rxc, qp); TASK_INIT(&qp->rxc_db_work, 0, ntb_transport_rxc_db, qp); STAILQ_INIT(&qp->rx_post_q); STAILQ_INIT(&qp->rx_pend_q); STAILQ_INIT(&qp->tx_free_q); callout_reset(&qp->link_work, 0, ntb_qp_link_work, qp); }
int main(int argc, char *argv[]) { struct mg_mgr mgr; struct mg_connection *nc; int i, redirect = 0; const char *vhost = NULL; mg_mgr_init(&mgr, NULL); /* Parse command line arguments */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0) { mgr.hexdump_file = argv[i + 1]; i++; } else if (strcmp(argv[i], "-k") == 0) { s_backend_keepalive = 1; } else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "-") == 0) { s_log_file = stdout; } else { s_log_file = fopen(argv[i + 1], "a"); if (s_log_file == NULL) { perror("fopen"); exit(EXIT_FAILURE); } } i++; } else if (strcmp(argv[i], "-p") == 0) { s_http_port = argv[i + 1]; i++; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { redirect = 1; } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "") == 0) { vhost = NULL; } else { vhost = argv[i + 1]; } i++; } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) { struct http_backend *be = vhost != NULL ? &s_vhost_backends[s_num_vhost_backends++] : &s_default_backends[s_num_default_backends++]; STAILQ_INIT(&be->conns); char *r = NULL; be->vhost = vhost; be->uri_prefix = argv[i + 1]; be->host_port = argv[i + 2]; be->redirect = redirect; be->uri_prefix_replacement = be->uri_prefix; if ((r = strchr(be->uri_prefix, '=')) != NULL) { *r = '\0'; be->uri_prefix_replacement = r + 1; } printf( "Adding backend for %s%s : %s " "[redirect=%d,prefix_replacement=%s]\n", be->vhost == NULL ? "" : be->vhost, be->uri_prefix, be->host_port, be->redirect, be->uri_prefix_replacement); vhost = NULL; redirect = 0; i += 2; #ifdef MG_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { s_ssl_cert = argv[++i]; #endif } else { print_usage_and_exit(argv[0]); } } /* Open listening socket */ if ((nc = mg_bind(&mgr, s_http_port, ev_handler)) == NULL) { fprintf(stderr, "mg_bind(%s) failed\n", s_http_port); exit(EXIT_FAILURE); } #if MG_ENABLE_SSL if (s_ssl_cert != NULL) { const char *err_str = mg_set_ssl(nc, s_ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } } #endif mg_set_protocol_http_websocket(nc); if (s_num_vhost_backends + s_num_default_backends == 0) { print_usage_and_exit(argv[0]); } signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); /* Run event loop until signal is received */ printf("Starting LB on port %s\n", s_http_port); while (s_sig_num == 0) { mg_mgr_poll(&mgr, 1000); } /* Cleanup */ mg_mgr_free(&mgr); printf("Exiting on signal %d\n", s_sig_num); return EXIT_SUCCESS; }
static int s1ap_eNB_handle_s1_setup_response(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *message_p) { S1ap_S1SetupResponseIEs_t *s1SetupResponse_p; s1ap_eNB_mme_data_t *mme_desc_p; int i; DevAssert(message_p != NULL); s1SetupResponse_p = &message_p->msg.s1ap_S1SetupResponseIEs; /* S1 Setup Response == Non UE-related procedure -> stream 0 */ if (stream != 0) { S1AP_ERROR("[SCTP %d] Received s1 setup response on stream != 0 (%d)\n", assoc_id, stream); return -1; } if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { S1AP_ERROR("[SCTP %d] Received S1 setup response for non existing " "MME context\n", assoc_id); return -1; } /* The list of served gummei can contain at most 8 elements. * LTE related gummei is the first element in the list, i.e with an id of 0. */ DevAssert(s1SetupResponse_p->servedGUMMEIs.list.count == 1); for (i = 0; i < s1SetupResponse_p->servedGUMMEIs.list.count; i++) { struct S1ap_ServedGUMMEIsItem *gummei_item_p; struct served_gummei_s *new_gummei_p; int j; gummei_item_p = (struct S1ap_ServedGUMMEIsItem *) s1SetupResponse_p->servedGUMMEIs.list.array[i]; new_gummei_p = calloc(1, sizeof(struct served_gummei_s)); STAILQ_INIT(&new_gummei_p->served_plmns); STAILQ_INIT(&new_gummei_p->served_group_ids); STAILQ_INIT(&new_gummei_p->mme_codes); for (j = 0; j < gummei_item_p->servedPLMNs.list.count; j++) { S1ap_PLMNidentity_t *plmn_identity_p; struct plmn_identity_s *new_plmn_identity_p; plmn_identity_p = gummei_item_p->servedPLMNs.list.array[i]; new_plmn_identity_p = calloc(1, sizeof(struct plmn_identity_s)); TBCD_TO_MCC_MNC(plmn_identity_p, new_plmn_identity_p->mcc, new_plmn_identity_p->mnc, new_plmn_identity_p->mnc_digit_length); STAILQ_INSERT_TAIL(&new_gummei_p->served_plmns, new_plmn_identity_p, next); new_gummei_p->nb_served_plmns++; } for (j = 0; j < gummei_item_p->servedGroupIDs.list.count; j++) { S1ap_MME_Group_ID_t *mme_group_id_p; struct served_group_id_s *new_group_id_p; mme_group_id_p = gummei_item_p->servedGroupIDs.list.array[i]; new_group_id_p = calloc(1, sizeof(struct served_group_id_s)); OCTET_STRING_TO_INT16(mme_group_id_p, new_group_id_p->mme_group_id); STAILQ_INSERT_TAIL(&new_gummei_p->served_group_ids, new_group_id_p, next); new_gummei_p->nb_group_id++; } for (j = 0; j < gummei_item_p->servedMMECs.list.count; j++) { S1ap_MME_Code_t *mme_code_p; struct mme_code_s *new_mme_code_p; mme_code_p = gummei_item_p->servedMMECs.list.array[i]; new_mme_code_p = calloc(1, sizeof(struct mme_code_s)); OCTET_STRING_TO_INT8(mme_code_p, new_mme_code_p->mme_code); STAILQ_INSERT_TAIL(&new_gummei_p->mme_codes, new_mme_code_p, next); new_gummei_p->nb_mme_code++; } STAILQ_INSERT_TAIL(&mme_desc_p->served_gummei, new_gummei_p, next); } /* Free contents of the list */ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1ap_ServedGUMMEIs, (void *)&s1SetupResponse_p->servedGUMMEIs); /* Set the capacity of this MME */ mme_desc_p->relative_mme_capacity = s1SetupResponse_p->relativeMMECapacity; /* Optionaly set the mme name */ if (s1SetupResponse_p->presenceMask & S1AP_S1SETUPRESPONSEIES_MMENAME_PRESENT) { mme_desc_p->mme_name = calloc(s1SetupResponse_p->mmEname.size + 1, sizeof(char)); memcpy(mme_desc_p->mme_name, s1SetupResponse_p->mmEname.buf, s1SetupResponse_p->mmEname.size); /* Convert the mme name to a printable string */ mme_desc_p->mme_name[s1SetupResponse_p->mmEname.size] = '\0'; } /* The association is now ready as eNB and MME know parameters of each other. * Mark the association as UP to enable UE contexts creation. */ mme_desc_p->state = S1AP_ENB_STATE_CONNECTED; mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb ++; s1ap_handle_s1_setup_message(mme_desc_p, 0); #if 0 /* We call back our self * -> generate a dummy initial UE message */ { s1ap_nas_first_req_t s1ap_nas_first_req; memset(&s1ap_nas_first_req, 0, sizeof(s1ap_nas_first_req_t)); s1ap_nas_first_req.rnti = 0xC03A; s1ap_nas_first_req.establishment_cause = RRC_CAUSE_MO_DATA; s1ap_nas_first_req.ue_identity.presenceMask = UE_IDENTITIES_gummei; s1ap_nas_first_req.ue_identity.gummei.mcc = 208; s1ap_nas_first_req.ue_identity.gummei.mnc = 34; s1ap_nas_first_req.ue_identity.gummei.mme_code = 0; s1ap_nas_first_req.ue_identity.gummei.mme_group_id = 0; /* NAS Attach request with IMSI */ static uint8_t nas_attach_req_imsi[] = { 0x07, 0x41, /* EPS Mobile identity = IMSI */ 0x71, 0x08, 0x29, 0x80, 0x43, 0x21, 0x43, 0x65, 0x87, 0xF9, /* End of EPS Mobile Identity */ 0x02, 0xE0, 0xE0, 0x00, 0x20, 0x02, 0x03, 0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2, 0x01, 0x27, 0x11, }; /* NAS Attach request with GUTI */ static uint8_t nas_attach_req_guti[] = { 0x07, 0x41, /* EPS Mobile identity = IMSI */ 0x71, 0x0B, 0xF6, 0x12, 0xF2, 0x01, 0x80, 0x00, 0x01, 0xE0, 0x00, 0xDA, 0x1F, /* End of EPS Mobile Identity */ 0x02, 0xE0, 0xE0, 0x00, 0x20, 0x02, 0x03, 0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00, 0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2, 0x01, 0x27, 0x11, }; s1ap_nas_first_req.nas_pdu.buffer = nas_attach_req_guti; s1ap_nas_first_req.nas_pdu.length = sizeof(nas_attach_req_guti); s1ap_eNB_handle_nas_first_req(mme_desc_p->s1ap_eNB_instance->instance, &s1ap_nas_first_req); } #endif return 0; }
/* ARGSUSED */ void random_yarrow_init(void) { int error, i; struct harvest *np; struct sysctl_oid *random_o, *random_sys_o, *random_sys_harvest_o; enum esource e; random_o = SYSCTL_ADD_NODE(&random_clist, SYSCTL_STATIC_CHILDREN(_kern), OID_AUTO, "random", CTLFLAG_RW, 0, "Software Random Number Generator"); random_yarrow_init_alg(&random_clist, random_o); random_sys_o = SYSCTL_ADD_NODE(&random_clist, SYSCTL_CHILDREN(random_o), OID_AUTO, "sys", CTLFLAG_RW, 0, "Entropy Device Parameters"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_o), OID_AUTO, "seeded", CTLTYPE_INT | CTLFLAG_RW, &random_systat.seeded, 1, random_check_boolean, "I", "Seeded State"); random_sys_harvest_o = SYSCTL_ADD_NODE(&random_clist, SYSCTL_CHILDREN(random_sys_o), OID_AUTO, "harvest", CTLFLAG_RW, 0, "Entropy Sources"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "ethernet", CTLTYPE_INT | CTLFLAG_RW, &harvest.ethernet, 1, random_check_boolean, "I", "Harvest NIC entropy"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "point_to_point", CTLTYPE_INT | CTLFLAG_RW, &harvest.point_to_point, 1, random_check_boolean, "I", "Harvest serial net entropy"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "interrupt", CTLTYPE_INT | CTLFLAG_RW, &harvest.interrupt, 1, random_check_boolean, "I", "Harvest IRQ entropy"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "swi", CTLTYPE_INT | CTLFLAG_RW, &harvest.swi, 0, random_check_boolean, "I", "Harvest SWI entropy"); /* Initialise the harvest fifos */ STAILQ_INIT(&emptyfifo.head); emptyfifo.count = 0; for (i = 0; i < EMPTYBUFFERS; i++) { np = malloc(sizeof(struct harvest), M_ENTROPY, M_WAITOK); STAILQ_INSERT_TAIL(&emptyfifo.head, np, next); } for (e = RANDOM_START; e < ENTROPYSOURCE; e++) { STAILQ_INIT(&harvestfifo[e].head); harvestfifo[e].count = 0; } mtx_init(&harvest_mtx, "entropy harvest mutex", NULL, MTX_SPIN); /* Start the hash/reseed thread */ error = kproc_create(random_kthread, NULL, &random_kthread_proc, RFHIGHPID, 0, "yarrow"); if (error != 0) panic("Cannot create entropy maintenance thread."); /* Register the randomness harvesting routine */ random_yarrow_init_harvester(random_harvest_internal, random_yarrow_read); }
int dfs_attach(struct ieee80211com *ic) { int i, n; struct ath_dfs *dfs = (struct ath_dfs *)ic->ic_dfs; struct ath_dfs_radar_tab_info radar_info; #define N(a) (sizeof(a)/sizeof(a[0])) if (dfs != NULL) { /*DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "%s: ic_dfs was not NULL\n", __func__); */ return 1; } dfs = (struct ath_dfs *)OS_MALLOC(NULL, sizeof(struct ath_dfs), GFP_ATOMIC); if (dfs == NULL) { /*DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "%s: ath_dfs allocation failed\n", __func__);*/ return 1; } OS_MEMZERO(dfs, sizeof (struct ath_dfs)); ic->ic_dfs = (void *)dfs; dfs->ic = ic; ic->ic_dfs_debug = dfs_get_debug_info; #ifndef ATH_DFS_RADAR_DETECTION_ONLY dfs->dfs_nol = NULL; #endif /* * Zero out radar_info. It's possible that the attach function won't * fetch an initial regulatory configuration; you really do want to * ensure that the contents indicates there aren't any filters. */ OS_MEMZERO(&radar_info, sizeof(radar_info)); ic->ic_dfs_attach(ic, &dfs->dfs_caps, &radar_info); dfs_clear_stats(ic); dfs->dfs_event_log_on = 0; OS_INIT_TIMER(NULL, &(dfs->ath_dfs_task_timer), dfs_task, (void *) (ic)); #ifndef ATH_DFS_RADAR_DETECTION_ONLY OS_INIT_TIMER(NULL, &(dfs->ath_dfstesttimer), dfs_testtimer_task, (void *) ic); dfs->ath_dfs_cac_time = ATH_DFS_WAIT_MS; dfs->ath_dfstesttime = ATH_DFS_TEST_RETURN_PERIOD_MS; #endif ATH_DFSQ_LOCK_INIT(dfs); STAILQ_INIT(&dfs->dfs_radarq); ATH_ARQ_LOCK_INIT(dfs); STAILQ_INIT(&dfs->dfs_arq); STAILQ_INIT(&(dfs->dfs_eventq)); ATH_DFSEVENTQ_LOCK_INIT(dfs); dfs->events = (struct dfs_event *)OS_MALLOC(NULL, sizeof(struct dfs_event)*DFS_MAX_EVENTS, GFP_ATOMIC); if (dfs->events == NULL) { OS_FREE(dfs); ic->ic_dfs = NULL; DFS_PRINTK("%s: events allocation failed\n", __func__); return 1; } for (i = 0; i < DFS_MAX_EVENTS; i++) { STAILQ_INSERT_TAIL(&(dfs->dfs_eventq), &dfs->events[i], re_list); } dfs->pulses = (struct dfs_pulseline *)OS_MALLOC(NULL, sizeof(struct dfs_pulseline), GFP_ATOMIC); if (dfs->pulses == NULL) { OS_FREE(dfs->events); dfs->events = NULL; OS_FREE(dfs); ic->ic_dfs = NULL; DFS_PRINTK("%s: pulse buffer allocation failed\n", __func__); return 1; } dfs->pulses->pl_lastelem = DFS_MAX_PULSE_BUFFER_MASK; /* Allocate memory for radar filters */ for (n=0; n<DFS_MAX_RADAR_TYPES; n++) { dfs->dfs_radarf[n] = (struct dfs_filtertype *)OS_MALLOC(NULL, sizeof(struct dfs_filtertype),GFP_ATOMIC); if (dfs->dfs_radarf[n] == NULL) { DFS_PRINTK("%s: cannot allocate memory for radar filter types\n", __func__); goto bad1; } OS_MEMZERO(dfs->dfs_radarf[n], sizeof(struct dfs_filtertype)); } /* Allocate memory for radar table */ dfs->dfs_radartable = (int8_t **)OS_MALLOC(NULL, 256*sizeof(int8_t *), GFP_ATOMIC); if (dfs->dfs_radartable == NULL) { DFS_PRINTK("%s: cannot allocate memory for radar table\n", __func__); goto bad1; } for (n=0; n<256; n++) { dfs->dfs_radartable[n] = OS_MALLOC(NULL, DFS_MAX_RADAR_OVERLAP*sizeof(int8_t), GFP_ATOMIC); if (dfs->dfs_radartable[n] == NULL) { DFS_PRINTK("%s: cannot allocate memory for radar table entry\n", __func__); goto bad2; } } if (usenol == 0) DFS_PRINTK("%s: NOL disabled\n", __func__); else if (usenol == 2) DFS_PRINTK("%s: NOL disabled; no CSA\n", __func__); dfs->dfs_rinfo.rn_use_nol = usenol; /* Init the cached extension channel busy for false alarm reduction */ dfs->dfs_rinfo.ext_chan_busy_ts = ic->ic_get_TSF64(ic); dfs->dfs_rinfo.dfs_ext_chan_busy = 0; /* Init the Bin5 chirping related data */ dfs->dfs_rinfo.dfs_bin5_chirp_ts = dfs->dfs_rinfo.ext_chan_busy_ts; dfs->dfs_rinfo.dfs_last_bin5_dur = MAX_BIN5_DUR; dfs->dfs_b5radars = NULL; /* * If dfs_init_radar_filters() fails, we can abort here and * reconfigure when the first valid channel + radar config * is available. */ if ( dfs_init_radar_filters( ic, &radar_info) ) { DFS_PRINTK(" %s: Radar Filter Intialization Failed \n", __func__); return 1; } dfs->ath_dfs_false_rssi_thres = RSSI_POSSIBLY_FALSE; dfs->ath_dfs_peak_mag = SEARCH_FFT_REPORT_PEAK_MAG_THRSH; dfs->dfs_phyerr_freq_min = 0x7fffffff; dfs->dfs_phyerr_freq_max = 0; dfs->dfs_phyerr_queued_count = 0; dfs->dfs_phyerr_w53_counter = 0; dfs->dfs_pri_multiplier = 2; dfs->ath_dfs_nol_timeout = DFS_NOL_TIMEOUT_S; return 0; bad2: OS_FREE(dfs->dfs_radartable); dfs->dfs_radartable = NULL; bad1: for (n=0; n<DFS_MAX_RADAR_TYPES; n++) { if (dfs->dfs_radarf[n] != NULL) { OS_FREE(dfs->dfs_radarf[n]); dfs->dfs_radarf[n] = NULL; } } if (dfs->pulses) { OS_FREE(dfs->pulses); dfs->pulses = NULL; } if (dfs->events) { OS_FREE(dfs->events); dfs->events = NULL; } if (ic->ic_dfs) { OS_FREE(ic->ic_dfs); ic->ic_dfs = NULL; } return 1; #undef N }
static int chipc_attach(device_t dev) { struct chipc_softc *sc; int error; sc = device_get_softc(dev); sc->dev = dev; sc->quirks = bhnd_device_quirks(dev, chipc_devices, sizeof(chipc_devices[0])); sc->sprom_refcnt = 0; CHIPC_LOCK_INIT(sc); STAILQ_INIT(&sc->mem_regions); /* Set up resource management */ if ((error = chipc_init_rman(sc))) { device_printf(sc->dev, "failed to initialize chipc resource state: %d\n", error); goto failed; } /* Allocate the region containing the chipc register block */ if ((sc->core_region = chipc_find_region_by_rid(sc, 0)) == NULL) { error = ENXIO; goto failed; } error = chipc_retain_region(sc, sc->core_region, RF_ALLOCATED|RF_ACTIVE); if (error) { sc->core_region = NULL; goto failed; } /* Save a direct reference to our chipc registers */ sc->core = sc->core_region->cr_res; /* Fetch and parse capability register(s) */ if ((error = chipc_read_caps(sc, &sc->caps))) goto failed; if (bootverbose) chipc_print_caps(sc->dev, &sc->caps); /* Attach all supported child devices */ if ((error = chipc_add_children(sc))) goto failed; if ((error = bus_generic_attach(dev))) goto failed; return (0); failed: device_delete_children(sc->dev); if (sc->core_region != NULL) { chipc_release_region(sc, sc->core_region, RF_ALLOCATED|RF_ACTIVE); } chipc_free_rman(sc); CHIPC_LOCK_DESTROY(sc); return (error); }
/** * Initialize the Link Layer. Should be called only once * * @return int */ void ble_ll_init(void) { int rc; uint8_t features; struct ble_ll_obj *lldata; /* Get pointer to global data object */ lldata = &g_ble_ll_data; /* Set acl pkt size and number */ lldata->ll_num_acl_pkts = MYNEWT_VAL(BLE_ACL_BUF_COUNT); lldata->ll_acl_pkt_size = MYNEWT_VAL(BLE_ACL_BUF_SIZE); /* Initialize eventq */ os_eventq_init(&lldata->ll_evq); /* Initialize the transmit (from host) and receive (from phy) queues */ STAILQ_INIT(&lldata->ll_tx_pkt_q); STAILQ_INIT(&lldata->ll_rx_pkt_q); /* Initialize transmit (from host) and receive packet (from phy) event */ lldata->ll_rx_pkt_ev.ev_cb = ble_ll_event_rx_pkt; lldata->ll_tx_pkt_ev.ev_cb = ble_ll_event_tx_pkt; lldata->ll_dbuf_overflow_ev.ev_cb = ble_ll_event_dbuf_overflow; /* Initialize the HW error timer */ os_callout_init(&g_ble_ll_data.ll_hw_err_timer, &g_ble_ll_data.ll_evq, ble_ll_hw_err_timer_cb, NULL); /* Initialize wait for response timer */ os_cputime_timer_init(&g_ble_ll_data.ll_wfr_timer, ble_ll_wfr_timer_exp, NULL); ble_ll_hci_os_event_buf = malloc( OS_MEMPOOL_BYTES(16, sizeof (struct os_event))); SYSINIT_PANIC_ASSERT(ble_ll_hci_os_event_buf != NULL); /* Create memory pool of OS events */ rc = os_mempool_init(&g_ble_ll_hci_ev_pool, 16, sizeof (struct os_event), ble_ll_hci_os_event_buf, "g_ble_ll_hci_ev_pool"); SYSINIT_PANIC_ASSERT(rc == 0); /* Initialize LL HCI */ ble_ll_hci_init(); /* Init the scheduler */ ble_ll_sched_init(); /* Initialize advertiser */ ble_ll_adv_init(); /* Initialize a scanner */ ble_ll_scan_init(); /* Initialize the connection module */ ble_ll_conn_module_init(); /* Set the supported features. NOTE: we always support extended reject. */ features = BLE_LL_FEAT_EXTENDED_REJ; #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) == 1) features |= BLE_LL_FEAT_DATA_LEN_EXT; #endif #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_CONN_PARAM_REQ) == 1) features |= BLE_LL_FEAT_CONN_PARM_REQ; #endif #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_SLAVE_INIT_FEAT_XCHG) == 1) features |= BLE_LL_FEAT_SLAVE_INIT; #endif #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1) features |= BLE_LL_FEAT_LE_ENCRYPTION; #endif #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1) features |= (BLE_LL_FEAT_LL_PRIVACY | BLE_LL_FEAT_EXT_SCAN_FILT); ble_ll_resolv_init(); #endif #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) == 1) features |= BLE_LL_FEAT_LE_PING; #endif /* Initialize random number generation */ ble_ll_rand_init(); /* XXX: This really doesn't belong here, as the address probably has not * been set yet. */ ble_ll_seed_prng(); lldata->ll_supp_features = features; /* Initialize the LL task */ os_task_init(&g_ble_ll_task, "ble_ll", ble_ll_task, NULL, MYNEWT_VAL(BLE_LL_PRIO), OS_WAIT_FOREVER, g_ble_ll_stack, BLE_LL_STACK_SIZE); rc = stats_init_and_reg(STATS_HDR(ble_ll_stats), STATS_SIZE_INIT_PARMS(ble_ll_stats, STATS_SIZE_32), STATS_NAME_INIT_PARMS(ble_ll_stats), "ble_ll"); SYSINIT_PANIC_ASSERT(rc == 0); ble_hci_trans_cfg_ll(ble_ll_hci_cmd_rx, NULL, ble_ll_hci_acl_rx, NULL); }
static void fwip_init(void *arg) { struct fwip_softc *fwip = ((struct fwip_eth_softc *)arg)->fwip; struct firewire_comm *fc; struct ifnet *ifp = fwip->fw_softc.fwip_ifp; struct fw_xferq *xferq; struct fw_xfer *xfer; struct mbuf *m; int i; FWIPDEBUG(ifp, "initializing\n"); fc = fwip->fd.fc; #define START 0 if (fwip->dma_ch < 0) { fwip->dma_ch = fw_open_isodma(fc, /* tx */0); if (fwip->dma_ch < 0) return; xferq = fc->ir[fwip->dma_ch]; xferq->flag |= FWXFERQ_EXTBUF | FWXFERQ_HANDLER | FWXFERQ_STREAM; xferq->flag &= ~0xff; xferq->flag |= broadcast_channel & 0xff; /* register fwip_input handler */ xferq->sc = (caddr_t) fwip; xferq->hand = fwip_stream_input; xferq->bnchunk = rx_queue_len; xferq->bnpacket = 1; xferq->psize = MCLBYTES; xferq->queued = 0; xferq->buf = NULL; xferq->bulkxfer = (struct fw_bulkxfer *) malloc( sizeof(struct fw_bulkxfer) * xferq->bnchunk, M_FWIP, M_WAITOK); if (xferq->bulkxfer == NULL) { printf("if_fwip: malloc failed\n"); return; } STAILQ_INIT(&xferq->stvalid); STAILQ_INIT(&xferq->stfree); STAILQ_INIT(&xferq->stdma); xferq->stproc = NULL; for (i = 0; i < xferq->bnchunk; i ++) { m = m_getcl(M_WAIT, MT_DATA, M_PKTHDR); xferq->bulkxfer[i].mbuf = m; m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; STAILQ_INSERT_TAIL(&xferq->stfree, &xferq->bulkxfer[i], link); } fwip->fwb.start = INET_FIFO; fwip->fwb.end = INET_FIFO + 16384; /* S3200 packet size */ /* pre-allocate xfer */ STAILQ_INIT(&fwip->fwb.xferlist); for (i = 0; i < rx_queue_len; i ++) { xfer = fw_xfer_alloc(M_FWIP); if (xfer == NULL) break; m = m_getcl(M_WAIT, MT_DATA, M_PKTHDR); xfer->recv.payload = mtod(m, uint32_t *); xfer->recv.pay_len = MCLBYTES; xfer->hand = fwip_unicast_input; xfer->fc = fc; xfer->sc = (caddr_t)fwip; xfer->mbuf = m; STAILQ_INSERT_TAIL(&fwip->fwb.xferlist, xfer, link); } fw_bindadd(fc, &fwip->fwb); STAILQ_INIT(&fwip->xferlist); for (i = 0; i < TX_MAX_QUEUE; i++) { xfer = fw_xfer_alloc(M_FWIP); if (xfer == NULL) break; xfer->send.spd = tx_speed; xfer->fc = fwip->fd.fc; xfer->sc = (caddr_t)fwip; xfer->hand = fwip_output_callback; STAILQ_INSERT_TAIL(&fwip->xferlist, xfer, link); } } else
void ath_cont_data(struct ath_softc *sc ,int val) { static struct sk_buff *skb = NULL; struct ieee80211_frame *hdr; static struct ieee80211com *ic; static struct ath_buf *bf,*prev,*first; static struct ath_desc *ds; static struct ath_hal *ah; static STAILQ_HEAD(tpc_buf,ath_buf) tmp_q; static int is_inited=0; struct ath_txq *txq; const HAL_RATE_TABLE *rt; u_int8_t *p; u_int32_t flags, txrate, r,i; u_int16_t hdrlen, framelen, dmalen,delay=0; #define MIN(a,b) ((a) < (b) ? (a) : (b)) if(is_inited == 0) { STAILQ_INIT(&tmp_q); is_inited=1; } /* enter CONT_DATA mode */ if (val && skb==NULL) { skb = ath_alloc_skb(4096, 32); if (skb == NULL) goto out; /* build output packet */ hdr = (struct ieee80211_frame *)skb_put(skb, sizeof(*hdr)); IEEE80211_ADDR_COPY(&hdr->i_addr1, test_addr); IEEE80211_ADDR_COPY(&hdr->i_addr2, test_addr); IEEE80211_ADDR_COPY(&hdr->i_addr3, test_addr); hdr->i_dur[0] = 0x0; hdr->i_dur[1] = 0x0; hdr->i_seq[0] = 0x5a; hdr->i_seq[1] = 0x5a; hdr->i_fc[0] = IEEE80211_FC0_TYPE_DATA; hdr->i_fc[1] = 0; hdrlen = sizeof(*hdr); for(r=0; r<2000; ) { p = skb_put(skb, sizeof(PN9Data)); memcpy(p, PN9Data, sizeof(PN9Data)); r += sizeof(PN9Data); } framelen = hdrlen + r + IEEE80211_CRC_LEN; ic = &sc->sc_ic; ah = sc->sc_ah; rt = sc->sc_currates; if (rt==NULL) { printk("no rate table\n"); goto out; } txrate = rt->info[rt->rateCount-1].rateCode; /* send at highest rate */ { int rix; if (sc->sc_txrate==0) sc->sc_txrate = 6000; for(rix=0; rix<rt->rateCount; rix++) { if (rt->info[rix].rateKbps==sc->sc_txrate) { txrate = rt->info[rix].rateCode; printk("txrate set to %dKbps\n", sc->sc_txrate); break; } } } ath_draintxq(sc); prev=first=NULL; /* send 20 frames for the Power Amp to settle down */ for(i=0;i<20;++i) { ATH_TXBUF_LOCK_BH(sc); bf = STAILQ_FIRST(&sc->sc_txbuf); if (bf != NULL) { STAILQ_REMOVE_HEAD(&sc->sc_txbuf,bf_list); } ATH_TXBUF_UNLOCK_BH(sc); if (bf==NULL) { printk("no tx buf\n"); goto out; } if(!i) first=bf; framelen = skb->len + IEEE80211_CRC_LEN; dmalen = skb->len; txq = sc->sc_ac2q[WME_AC_VO]; bf->bf_skbaddr = bus_map_single(sc->sc_bdev, skb->data, framelen, BUS_DMA_TODEVICE); bf->bf_skb = skb; bf->bf_node = 0; flags = HAL_TXDESC_CLRDMASK; ds = bf->bf_desc; if(prev) prev->bf_desc->ds_link = bf->bf_daddr; /* link from prev desc */ ds->ds_data = bf->bf_skbaddr; printk("txpower set to %d\n", sc->sc_txpower); r = ath_hal_setuptxdesc(ah, ds, framelen, hdrlen, HAL_PKT_TYPE_NORMAL, sc->sc_txpower, txrate, /* tx rate */ 15, /* max retries */ HAL_TXKEYIX_INVALID, /* no WEP */ 1, /* select Omni Antenna 0 */ flags, 0, /* rts/cts rate */ 0 /* rts/cts duration */ ); if (r==AH_FALSE) { printk("fail setuptxdesc r(%d)\n", r); goto out; } r = ath_hal_filltxdesc(ah, ds, skb->len, AH_TRUE, AH_TRUE,ds); if (r==AH_FALSE) { printk("fail fill tx desc r(%d)\n", r); goto out; } ath_hal_setupxtxdesc(ah, ds , txrate, 15 /* series 1 */ , txrate, 15 /* series 2 */ , txrate, 15 /* series 3 */ ); /* insert the buffers in to tmp_q */ STAILQ_INSERT_HEAD(&tmp_q,bf,bf_list); #if 0 ATH_TXQ_LOCK_BH(txq); ATH_TXQ_INSERT_TAIL(txq, bf, bf_list); ATH_TXQ_UNLOCK_BH(txq); #endif prev=bf; } ath_hal_intrset(ah, 0); /* disable interrupts */ //sc->sc_imask = HAL_INT_RX | HAL_INT_TX // | HAL_INT_RXEOL | HAL_INT_RXORN // | HAL_INT_FATAL | HAL_INT_GLOBAL; sc->sc_imask = 0; //ath_hal_intrset(ah, sc->sc_imask); bf->bf_desc->ds_link = NULL; r = ath_hal_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); ath_hal_txstart(ah, txq->axq_qnum); while(ath_hal_txprocdesc(ah,bf->bf_desc) == HAL_EINPROGRESS) { udelay(2000); ++delay; } /* sleep for 20ms */ udelay(20000); printk("took %d msec to transmit the 20 frames \n",2*delay); /* start TX99 mode */ ath_stoprecv(sc); /* stop recv side */ bf->bf_desc->ds_link = first->bf_daddr; /* link to self */ ath_hal_getdiagstate(ah, 19,(void *) sc->sc_prefetch,9,NULL,NULL); ath_hal_getdiagstate(ah, 19, txq->axq_qnum, val,NULL,NULL); ath_hal_txstart(ah, txq->axq_qnum); } /* leave CONT_DATA mode, reset the chip */ if (val==0 && skb) { int j=0; ath_hal_getdiagstate(ah, 19, 0, 0,NULL,NULL); /* insert the buffers back into txbuf list */ ATH_TXBUF_LOCK_BH(sc); bf = STAILQ_FIRST(&tmp_q); while(bf) { bf->bf_skb=NULL; STAILQ_REMOVE_HEAD(&tmp_q,bf_list); STAILQ_INSERT_HEAD(&sc->sc_txbuf,bf,bf_list); bf = STAILQ_FIRST(&tmp_q); ++j; } ATH_TXBUF_UNLOCK_BH(sc); printk("inserted back %d buffers \n",j); ic->ic_reset(ic->ic_dev); skb = NULL; bf = NULL; } if (val==7 && skb) { ath_hal_getdiagstate(ah, 19, ds, 7,NULL,NULL); } out: return; #undef MIN }
struct nandsim_chip * nandsim_chip_init(struct nandsim_softc* sc, uint8_t chip_num, struct sim_chip *sim_chip) { struct nandsim_chip *chip; struct onfi_params *chip_param; char swapfile[20]; uint32_t size; int error; chip = malloc(sizeof(*chip), M_NANDSIM, M_WAITOK | M_ZERO); if (!chip) return (NULL); mtx_init(&chip->ns_lock, "nandsim lock", NULL, MTX_DEF); callout_init(&chip->ns_callout, 1); STAILQ_INIT(&chip->nandsim_events); chip->chip_num = chip_num; chip->ctrl_num = sim_chip->ctrl_num; chip->sc = sc; if (!sim_chip->is_wp) nandchip_set_status(chip, NAND_STATUS_WP); chip_param = &chip->params; chip->id.dev_id = sim_chip->device_id; chip->id.man_id = sim_chip->manufact_id; chip->error_ratio = sim_chip->error_ratio; chip->wear_level = sim_chip->wear_level; chip->prog_delay = sim_chip->prog_time; chip->erase_delay = sim_chip->erase_time; chip->read_delay = sim_chip->read_time; chip_param->t_prog = sim_chip->prog_time; chip_param->t_bers = sim_chip->erase_time; chip_param->t_r = sim_chip->read_time; bcopy("onfi", &chip_param->signature, 4); chip_param->manufacturer_id = sim_chip->manufact_id; strncpy(chip_param->manufacturer_name, sim_chip->manufacturer, 12); chip_param->manufacturer_name[11] = 0; strncpy(chip_param->device_model, sim_chip->device_model, 20); chip_param->device_model[19] = 0; chip_param->bytes_per_page = sim_chip->page_size; chip_param->spare_bytes_per_page = sim_chip->oob_size; chip_param->pages_per_block = sim_chip->pgs_per_blk; chip_param->blocks_per_lun = sim_chip->blks_per_lun; chip_param->luns = sim_chip->luns; init_chip_geom(&chip->cg, chip_param->luns, chip_param->blocks_per_lun, chip_param->pages_per_block, chip_param->bytes_per_page, chip_param->spare_bytes_per_page); chip_param->address_cycles = sim_chip->row_addr_cycles | (sim_chip->col_addr_cycles << 4); chip_param->features = sim_chip->features; if (sim_chip->width == 16) chip_param->features |= ONFI_FEAT_16BIT; size = chip_param->blocks_per_lun * chip_param->luns; error = nandsim_blk_state_init(chip, size, sim_chip->wear_level); if (error) { mtx_destroy(&chip->ns_lock); free(chip, M_NANDSIM); return (NULL); } error = nandsim_bbm_init(chip, size, sim_chip->bad_block_map); if (error) { mtx_destroy(&chip->ns_lock); nandsim_blk_state_destroy(chip); free(chip, M_NANDSIM); return (NULL); } nandsim_start_handler(chip, poweron_evh); nand_debug(NDBG_SIM,"Create thread for chip%d [%8p]", chip->chip_num, chip); /* Create chip thread */ error = kproc_kthread_add(nandsim_loop, chip, &nandsim_proc, &chip->nandsim_td, RFSTOPPED | RFHIGHPID, 0, "nandsim", "chip"); if (error) { mtx_destroy(&chip->ns_lock); nandsim_blk_state_destroy(chip); free(chip, M_NANDSIM); return (NULL); } thread_lock(chip->nandsim_td); sched_class(chip->nandsim_td, PRI_REALTIME); sched_add(chip->nandsim_td, SRQ_BORING); thread_unlock(chip->nandsim_td); size = (chip_param->bytes_per_page + chip_param->spare_bytes_per_page) * chip_param->pages_per_block; sprintf(swapfile, "chip%d%d.swp", chip->ctrl_num, chip->chip_num); chip->swap = nandsim_swap_init(swapfile, chip_param->blocks_per_lun * chip_param->luns, size); if (!chip->swap) nandsim_chip_destroy(chip); /* Wait for new thread to enter main loop */ tsleep(chip->nandsim_td, PWAIT, "ns_chip", 1 * hz); return (chip); }
int scsiattrib(struct cam_device *device, int argc, char **argv, char *combinedopt, int retry_count, int timeout, int verbosemode, int err_recover) { union ccb *ccb = NULL; int attr_num = -1; #if 0 int num_attrs = 0; #endif int start_attr = 0; int cached_attr = 0; int read_service_action = -1; int read_attr = 0, write_attr = 0; int element_address = 0; int element_type = ELEMENT_TYPE_ALL; int partition = 0; int logical_volume = 0; char *endptr; uint8_t *data_buf = NULL; uint32_t dxfer_len = UINT16_MAX - 1; uint32_t valid_len; uint32_t output_format; STAILQ_HEAD(, scsi_attr_desc) write_attr_list; int error = 0; int c; ccb = cam_getccb(device); if (ccb == NULL) { warnx("%s: error allocating CCB", __func__); error = 1; goto bailout; } bzero(&(&ccb->ccb_h)[1], sizeof(union ccb) - sizeof(struct ccb_hdr)); STAILQ_INIT(&write_attr_list); /* * By default, when displaying attribute values, we trim out * non-ASCII characters in ASCII fields. We display all fields * (description, attribute number, attribute size, and readonly * status). We default to displaying raw text. * * XXX KDM need to port this to stable/10 and newer FreeBSD * versions that have iconv built in and can convert codesets. */ output_format = SCSI_ATTR_OUTPUT_NONASCII_TRIM | SCSI_ATTR_OUTPUT_FIELD_ALL | SCSI_ATTR_OUTPUT_TEXT_RAW; data_buf = malloc(dxfer_len); if (data_buf == NULL) { warn("%s: error allocating %u bytes", __func__, dxfer_len); error = 1; goto bailout; } while ((c = getopt(argc, argv, combinedopt)) != -1) { switch (c) { case 'a': attr_num = strtol(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid attribute number %s", __func__, optarg); error = 1; goto bailout; } start_attr = attr_num; break; case 'c': cached_attr = 1; break; case 'e': element_address = strtol(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid element address %s", __func__, optarg); error = 1; goto bailout; } break; case 'F': { scsi_nv_status status; scsi_attrib_output_flags new_outflags; int entry_num = 0; char *tmpstr; if (isdigit(optarg[0])) { output_format = strtoul(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid numeric output " "format argument %s", __func__, optarg); error = 1; goto bailout; } break; } new_outflags = SCSI_ATTR_OUTPUT_NONE; while ((tmpstr = strsep(&optarg, ",")) != NULL) { status = scsi_get_nv(output_format_map, sizeof(output_format_map) / sizeof(output_format_map[0]), tmpstr, &entry_num, SCSI_NV_FLAG_IG_CASE); if (status == SCSI_NV_FOUND) new_outflags |= output_format_map[entry_num].value; else { warnx("%s: %s format option %s", __func__, (status == SCSI_NV_AMBIGUOUS) ? "ambiguous" : "invalid", tmpstr); error = 1; goto bailout; } } output_format = new_outflags; break; } case 'p': partition = strtol(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid partition number %s", __func__, optarg); error = 1; goto bailout; } break; case 'r': { scsi_nv_status status; int entry_num = 0; status = scsi_get_nv(sa_map, sizeof(sa_map) / sizeof(sa_map[0]), optarg, &entry_num, SCSI_NV_FLAG_IG_CASE); if (status == SCSI_NV_FOUND) read_service_action = sa_map[entry_num].value; else { warnx("%s: %s %s option %s", __func__, (status == SCSI_NV_AMBIGUOUS) ? "ambiguous" : "invalid", "service action", optarg); error = 1; goto bailout; } read_attr = 1; break; } case 's': start_attr = strtol(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid starting attr argument %s", __func__, optarg); error = 1; goto bailout; } break; case 'T': { scsi_nv_status status; int entry_num = 0; status = scsi_get_nv(elem_type_map, sizeof(elem_type_map) / sizeof(elem_type_map[0]), optarg, &entry_num, SCSI_NV_FLAG_IG_CASE); if (status == SCSI_NV_FOUND) element_type = elem_type_map[entry_num].value; else { warnx("%s: %s %s option %s", __func__, (status == SCSI_NV_AMBIGUOUS) ? "ambiguous" : "invalid", "element type", optarg); error = 1; goto bailout; } break; } case 'w': warnx("%s: writing attributes is not implemented yet", __func__); error = 1; goto bailout; break; case 'V': logical_volume = strtol(optarg, &endptr, 0); if (*endptr != '\0') { warnx("%s: invalid logical volume argument %s", __func__, optarg); error = 1; goto bailout; } break; default: break; } } /* * Default to reading attributes */ if (((read_attr == 0) && (write_attr == 0)) || ((read_attr != 0) && (write_attr != 0))) { warnx("%s: Must specify either -r or -w", __func__); error = 1; goto bailout; } if (read_attr != 0) { scsi_read_attribute(&ccb->csio, /*retries*/ retry_count, /*cbfcnp*/ NULL, /*tag_action*/ MSG_SIMPLE_Q_TAG, /*service_action*/ read_service_action, /*element*/ element_address, /*elem_type*/ element_type, /*logical_volume*/ logical_volume, /*partition*/ partition, /*first_attribute*/ start_attr, /*cache*/ cached_attr, /*data_ptr*/ data_buf, /*length*/ dxfer_len, /*sense_len*/ SSD_FULL_SIZE, /*timeout*/ timeout ? timeout : 60000); #if 0 } else { #endif } ccb->ccb_h.flags |= CAM_DEV_QFRZDIS; if (err_recover != 0) ccb->ccb_h.flags |= CAM_PASS_ERR_RECOVER; if (cam_send_ccb(device, ccb) < 0) { warn("error sending %s ATTRIBUTE", (read_attr != 0) ? "READ" : "WRITE"); if (verbosemode != 0) { cam_error_print(device, ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr); } error = 1; goto bailout; } if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { if (verbosemode != 0) { cam_error_print(device, ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr); } error = 1; goto bailout; } if (read_attr == 0) goto bailout; valid_len = dxfer_len - ccb->csio.resid; switch (read_service_action) { case SRA_SA_ATTR_VALUES: { uint32_t len_left, hdr_len, cur_len; struct scsi_read_attribute_values *hdr; struct scsi_mam_attribute_header *cur_id; char error_str[512]; uint8_t *cur_pos; struct sbuf *sb; hdr = (struct scsi_read_attribute_values *)data_buf; if (valid_len < sizeof(*hdr)) { fprintf(stdout, "No attributes returned.\n"); error = 0; goto bailout; } sb = sbuf_new_auto(); if (sb == NULL) { warn("%s: Unable to allocate sbuf", __func__); error = 1; goto bailout; } /* * XXX KDM grab more data if it is available. */ hdr_len = scsi_4btoul(hdr->length); for (len_left = MIN(valid_len, hdr_len), cur_pos = &hdr->attribute_0[0]; len_left > sizeof(*cur_id); len_left -= cur_len, cur_pos += cur_len) { int cur_attr_num; cur_id = (struct scsi_mam_attribute_header *)cur_pos; cur_len = scsi_2btoul(cur_id->length) + sizeof(*cur_id); cur_attr_num = scsi_2btoul(cur_id->id); if ((attr_num != -1) && (cur_attr_num != attr_num)) continue; error = scsi_attrib_sbuf(sb, cur_id, len_left, /*user_table*/ NULL, /*num_user_entries*/ 0, /*prefer_user_table*/ 0, output_format, error_str, sizeof(error_str)); if (error != 0) { warnx("%s: %s", __func__, error_str); sbuf_delete(sb); error = 1; goto bailout; } if (attr_num != -1) break; } sbuf_finish(sb); fprintf(stdout, "%s", sbuf_data(sb)); sbuf_delete(sb); break; } case SRA_SA_SUPPORTED_ATTRS: case SRA_SA_ATTR_LIST: { uint32_t len_left, hdr_len; struct scsi_attrib_list_header *hdr; struct scsi_attrib_table_entry *entry = NULL; const char *sa_name = "Supported Attributes"; const char *at_name = "Available Attributes"; int attr_id; uint8_t *cur_id; hdr = (struct scsi_attrib_list_header *)data_buf; if (valid_len < sizeof(*hdr)) { fprintf(stdout, "No %s\n", (read_service_action == SRA_SA_SUPPORTED_ATTRS)? sa_name : at_name); error = 0; goto bailout; } fprintf(stdout, "%s:\n", (read_service_action == SRA_SA_SUPPORTED_ATTRS) ? sa_name : at_name); hdr_len = scsi_4btoul(hdr->length); for (len_left = MIN(valid_len, hdr_len), cur_id = &hdr->first_attr_0[0]; len_left > 1; len_left -= sizeof(uint16_t), cur_id += sizeof(uint16_t)) { attr_id = scsi_2btoul(cur_id); if ((attr_num != -1) && (attr_id != attr_num)) continue; entry = scsi_get_attrib_entry(attr_id); fprintf(stdout, "0x%.4x", attr_id); if (entry == NULL) fprintf(stdout, "\n"); else fprintf(stdout, ": %s\n", entry->desc); if (attr_num != -1) break; } break; } case SRA_SA_PART_LIST: case SRA_SA_LOG_VOL_LIST: { struct scsi_attrib_lv_list *lv_list; const char *partition_name = "Partition"; const char *lv_name = "Logical Volume"; if (valid_len < sizeof(*lv_list)) { fprintf(stdout, "No %s list returned\n", (read_service_action == SRA_SA_PART_LIST) ? partition_name : lv_name); error = 0; goto bailout; } lv_list = (struct scsi_attrib_lv_list *)data_buf; fprintf(stdout, "First %s: %d\n", (read_service_action == SRA_SA_PART_LIST) ? partition_name : lv_name, lv_list->first_lv_number); fprintf(stdout, "Number of %ss: %d\n", (read_service_action == SRA_SA_PART_LIST) ? partition_name : lv_name, lv_list->num_logical_volumes); break; } default: break; } bailout: if (ccb != NULL) cam_freeccb(ccb); free(data_buf); return (error); }
static void _xml_start_cb(void *data, const char *el, const char **attr) { XML_Parser p; int i, j; p = data; if (!strcmp(el, "ic")) { if (_cur_ic != NULL) errx(1, "Nested IC at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); _cur_ic = calloc(1, sizeof(*_cur_ic)); STAILQ_INIT(&_cur_ic->tplist); if (_cur_ic == NULL) err(1, "calloc"); for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "file")) { _cur_ic->file = strdup(attr[i + 1]); if (_cur_ic->file == NULL) err(1, "strdup"); break; } } if (_cur_ic->file == NULL) errx(1, "IC without 'file' attribute at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); } else if (!strcmp(el, "tp")) { if (_cur_ic == NULL) errx(1, "TP without containing IC at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); if (_cur_tp != NULL) errx(1, "Nested TP at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); _cur_tp = calloc(1, sizeof(*_cur_tp)); STAILQ_INIT(&_cur_tp->vclist); if (_cur_tp == NULL) err(1, "calloc"); for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "func")) { for (j = 0; dwarf_tp_array[j].tp_name != NULL; j++) if (!strcmp(attr[i + 1], dwarf_tp_array[j].tp_name)) { _cur_tp->dtp = &dwarf_tp_array[j]; break; } if (_cur_tp->dtp == NULL) errx(1, "TP function '%s' not found", attr[i]); break; } } if (_cur_tp->dtp == NULL) errx(1, "TP without 'func' attribute at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); } else if (!strcmp(el, "vc")) { if (_cur_tp == NULL) errx(1, "VC without containing IC at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); if (_cur_vc != NULL) errx(1, "Nested VC at line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); _cur_vc = calloc(1, sizeof(*_cur_vc)); _cur_vc->op = _OP_EQ; _cur_vc->fail = _FAIL_CONTINUE; if (_cur_vc == NULL) err(1, "calloc"); for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "var")) { _cur_vc->var = strdup(attr[i + 1]); if (_cur_vc->var == NULL) err(1, "strdup"); } else if (!strcmp(attr[i], "type")) { if (!strcmp(attr[i + 1], "int")) _cur_vc->vt = _VTYPE_INT; else if (!strcmp(attr[i + 1], "uint")) _cur_vc->vt = _VTYPE_UINT; else if (!strcmp(attr[i + 1], "str")) _cur_vc->vt = _VTYPE_STRING; else if (!strcmp(attr[i + 1], "block")) _cur_vc->vt = _VTYPE_BLOCK; else errx(1, "Unknown value type %s at " "line %jd", attr[i + 1], (intmax_t) XML_GetCurrentLineNumber(p)); } else if (!strcmp(attr[i], "op")) { if (!strcmp(attr[i + 1], "ne")) _cur_vc->op = _OP_NE; } else if (!strcmp(attr[i], "fail")) { if (!strcmp(attr[i + 1], "abort")) _cur_vc->fail = _FAIL_ABORT; } else errx(1, "Unknown attr %s at line %jd", attr[i], (intmax_t) XML_GetCurrentLineNumber(p)); } if (_cur_vc->var == NULL || _cur_vc->vt == _VTYPE_NONE) errx(1, "VC without 'var' or 'type' attribute at" " line %jd", (intmax_t) XML_GetCurrentLineNumber(p)); } else errx(1, "Unknown element %s at line %jd", el, (intmax_t) XML_GetCurrentLineNumber(p)); }
int main() { fd_set rset, allset; int rv, ch; Room *room1, *room2; int listenfd, connfd, errno; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; int i; struct timeval atv; //Room ** rooms; //queue initilization STAILQ_INIT(&head); //creation of the socket listenfd = socket (AF_INET, SOCK_STREAM, 0); //preparation of the socket address servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); listen(listenfd, LISTENQ); printf("%s\n","Server running...waiting for connections."); tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&allset); FD_SET(listenfd, &allset); fcntl (listenfd, F_SETFL, O_NONBLOCK); //rooms = (Room **)calloc(ROOMNUMS, sizeof(Room *); /* room1 = (Room *)calloc(1,sizeof(Room)); room1->p1 = -1; room1->p2 = -1; room1->move1 = -1; room1->move2 = -1; room2 = (Room *)calloc(1,sizeof(Room)); room2->p1 = -1; room2->p2 = -1; room2->move1 = -1; room2->move2 = -1; //*/for(i = 0; i < ROOMNUMS; i++) { /* rooms[i] = (Room *)calloc(1,sizeof(Room)); rooms[i]->p1 = -1; rooms[i]->p2 = -1; rooms[i]->move1 = -1; rooms[i]->move2 = -1; }*/ for ( ; ; ) { rset = allset; select(listenfd + 1, &rset, NULL, NULL, &tv); if (FD_ISSET(listenfd, &rset)) { /* new client connection */ //sleep(1); clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); if(connfd != -1) { printf("%s\n","Received request..."); printf("added to que\n"); add_to_queue(connfd); listen(listenfd, LISTENQ); } } play(room1); play(room2); if(room1->playeramount == 1 && room2->playeramount == 1) { if(room1->p1 == -1) { if(room2->p1 != -1) { room1->p1 = room2->p1; room2->p1 = -1; room2->playeramount--; room1->playeramount++; } else if(room2->p2 != -1) { room1->p1 = room2->p2; room2->p2 = -1; room2->playeramount--; room1->playeramount++; } } else if(room1->p2 == -1) { if(room2->p1 != -1) { room1->p2 = room2->p1; room2->p1 = -1; room2->playeramount--; room1->playeramount++; } else if(room2->p2 != -1) { room1->p2 = room2->p2; room2->p2 = -1; room2->playeramount--; room1->playeramount++; } } } } //close listening socket close(listenfd); free(room1); free(room2); /* for(i = 0; i < ROOMNUMS; i++) { free(rooms[i]); } free(rooms); */ }
static void config_parse(const ucl_object_t *obj, pkg_conf_file_t conftype) { struct sbuf *buf = sbuf_new_auto(); const ucl_object_t *cur, *seq; ucl_object_iter_t it = NULL, itseq = NULL; struct config_entry *temp_config; struct config_value *cv; const char *key; int i; size_t j; /* Temporary config for configs that may be disabled. */ temp_config = calloc(CONFIG_SIZE, sizeof(struct config_entry)); while ((cur = ucl_iterate_object(obj, &it, true))) { key = ucl_object_key(cur); if (key == NULL) continue; sbuf_clear(buf); if (conftype == CONFFILE_PKG) { for (j = 0; j < strlen(key); ++j) sbuf_putc(buf, key[j]); sbuf_finish(buf); } else if (conftype == CONFFILE_REPO) { if (strcasecmp(key, "url") == 0) sbuf_cpy(buf, "PACKAGESITE"); else if (strcasecmp(key, "mirror_type") == 0) sbuf_cpy(buf, "MIRROR_TYPE"); else if (strcasecmp(key, "signature_type") == 0) sbuf_cpy(buf, "SIGNATURE_TYPE"); else if (strcasecmp(key, "fingerprints") == 0) sbuf_cpy(buf, "FINGERPRINTS"); else if (strcasecmp(key, "enabled") == 0) { if ((cur->type != UCL_BOOLEAN) || !ucl_object_toboolean(cur)) goto cleanup; } else continue; sbuf_finish(buf); } for (i = 0; i < CONFIG_SIZE; i++) { if (strcmp(sbuf_data(buf), c[i].key) == 0) break; } /* Silently skip unknown keys to be future compatible. */ if (i == CONFIG_SIZE) continue; /* env has priority over config file */ if (c[i].envset) continue; /* Parse sequence value ["item1", "item2"] */ switch (c[i].type) { case PKG_CONFIG_LIST: if (cur->type != UCL_ARRAY) { warnx("Skipping invalid array " "value for %s.\n", c[i].key); continue; } temp_config[i].list = malloc(sizeof(*temp_config[i].list)); STAILQ_INIT(temp_config[i].list); while ((seq = ucl_iterate_object(cur, &itseq, true))) { if (seq->type != UCL_STRING) continue; cv = malloc(sizeof(struct config_value)); cv->value = strdup(ucl_object_tostring(seq)); STAILQ_INSERT_TAIL(temp_config[i].list, cv, next); } break; case PKG_CONFIG_BOOL: temp_config[i].value = strdup(ucl_object_toboolean(cur) ? "yes" : "no"); break; default: /* Normal string value. */ temp_config[i].value = strdup(ucl_object_tostring(cur)); break; } } /* Repo is enabled, copy over all settings from temp_config. */ for (i = 0; i < CONFIG_SIZE; i++) { if (c[i].envset) continue; /* Prevent overriding ABI, ASSUME_ALWAYS_YES, etc. */ if (conftype != CONFFILE_PKG && c[i].main_only == true) continue; switch (c[i].type) { case PKG_CONFIG_LIST: c[i].list = temp_config[i].list; break; default: c[i].value = temp_config[i].value; break; } } cleanup: free(temp_config); sbuf_delete(buf); }
static int _dwarf_producer_init(Dwarf_Debug dbg, Dwarf_Unsigned pf, Dwarf_Error *error) { /* Producer only support DWARF2 which has fixed 32bit offset. */ dbg->dbg_offset_size = 4; if (pf & DW_DLC_SIZE_32 && pf & DW_DLC_SIZE_64) { DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); return (DW_DLE_ARGUMENT); } if ((pf & DW_DLC_SIZE_32) == 0 && (pf & DW_DLC_SIZE_64) == 0) pf |= DW_DLC_SIZE_32; if (pf & DW_DLC_SIZE_64) dbg->dbg_pointer_size = 8; else dbg->dbg_pointer_size = 4; if (pf & DW_DLC_ISA_IA64 && pf & DW_DLC_ISA_MIPS) { DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); return (DW_DLE_ARGUMENT); } if (pf & DW_DLC_ISA_IA64) dbg->dbgp_isa = DW_ISA_IA64; else dbg->dbgp_isa = DW_ISA_MIPS; if (pf & DW_DLC_TARGET_BIGENDIAN && pf & DW_DLC_TARGET_LITTLEENDIAN) { DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); return (DW_DLE_ARGUMENT); } if ((pf & DW_DLC_TARGET_BIGENDIAN) == 0 && (pf & DW_DLC_TARGET_LITTLEENDIAN) == 0) { #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_BIG_ENDIAN pf |= DW_DLC_TARGET_BIGENDIAN; #else pf |= DW_DLC_TARGET_LITTLEENDIAN; #endif } if (pf & DW_DLC_TARGET_BIGENDIAN) { dbg->write = _dwarf_write_msb; dbg->write_alloc = _dwarf_write_msb_alloc; } else if (pf & DW_DLC_TARGET_LITTLEENDIAN) { dbg->write = _dwarf_write_lsb; dbg->write_alloc = _dwarf_write_lsb_alloc; } else assert(0); if (pf & DW_DLC_STREAM_RELOCATIONS && pf & DW_DLC_SYMBOLIC_RELOCATIONS) { DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); return (DW_DLE_ARGUMENT); } if ((pf & DW_DLC_STREAM_RELOCATIONS) == 0 && (pf & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) pf |= DW_DLC_STREAM_RELOCATIONS; dbg->dbgp_flags = pf; STAILQ_INIT(&dbg->dbgp_dielist); STAILQ_INIT(&dbg->dbgp_pelist); STAILQ_INIT(&dbg->dbgp_seclist); STAILQ_INIT(&dbg->dbgp_drslist); STAILQ_INIT(&dbg->dbgp_cielist); STAILQ_INIT(&dbg->dbgp_fdelist); if ((dbg->dbgp_lineinfo = calloc(1, sizeof(struct _Dwarf_LineInfo))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INIT(&dbg->dbgp_lineinfo->li_lflist); STAILQ_INIT(&dbg->dbgp_lineinfo->li_lnlist); if ((dbg->dbgp_as = calloc(1, sizeof(struct _Dwarf_ArangeSet))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INIT(&dbg->dbgp_as->as_arlist); return (DW_DLE_NONE); }
static int32_t snmp_import_table(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *obj) { int32_t i; enum snmp_tc tc; enum tok tok; struct snmp_index_entry *entry; if ((entry = malloc(sizeof(struct snmp_index_entry))) == NULL) { syslog(LOG_ERR, "malloc() failed: %s", strerror(errno)); return (-1); } memset(entry, 0, sizeof(struct snmp_index_entry)); STAILQ_INIT(&(entry->index_list)); for (i = 0, tok = gettoken(snmptoolctx); i < SNMP_INDEXES_MAX; i++) { int32_t syntax; struct enum_pairs *enums = NULL; if (tok != TOK_TYPE && tok != TOK_DEFTYPE && tok != TOK_ENUM && tok != TOK_BITS) break; if ((syntax = parse_type(snmptoolctx, &tok, &tc, &enums)) < 0) { enum_pairs_free(enums); snmp_index_listfree(&(entry->index_list)); free(entry); return (-1); } if (snmp_syntax_insert(&(entry->index_list), enums, syntax, tc) < 0) { snmp_index_listfree(&(entry->index_list)); enum_pairs_free(enums); free(entry); return (-1); } } if (i == 0 || i > SNMP_INDEXES_MAX) { warnx("Bad number of indexes at line %d", input->lno); snmp_index_listfree(&(entry->index_list)); free(entry); return (-1); } if (tok != TOK_STR) { warnx("String expected after indexes at line %d", input->lno); snmp_index_listfree(&(entry->index_list)); free(entry); return (-1); } entry->string = obj->string; entry->strlen = obj->strlen; asn_append_oid(&(entry->var), &(obj->var)); if ((i = snmp_table_insert(snmptoolctx, entry)) < 0) { snmp_index_listfree(&(entry->index_list)); free(entry); return (-1); } else if (i == 0) { /* Same entry already present in lists. */ free(entry->string); free(entry); } (void) snmp_import_update_table(ENTRY_INDEX, entry); return (1); }
int main(int argc, char *argv[]) { extern char *optarg; extern int optind; int ch; int retval; char *inputfilename; scope_t *sentinal; STAILQ_INIT(&patches); SLIST_INIT(&search_path); STAILQ_INIT(&seq_program); TAILQ_INIT(&cs_tailq); SLIST_INIT(&scope_stack); /* Set Sentinal scope node */ sentinal = scope_alloc(); sentinal->type = SCOPE_ROOT; includes_search_curdir = 1; appname = *argv; regfile = NULL; listfile = NULL; #if DEBUG yy_flex_debug = 0; mm_flex_debug = 0; yydebug = 0; mmdebug = 0; #endif while ((ch = getopt(argc, argv, "d:i:l:n:o:p:r:I:")) != -1) { switch(ch) { case 'd': #if DEBUG if (strcmp(optarg, "s") == 0) { yy_flex_debug = 1; mm_flex_debug = 1; } else if (strcmp(optarg, "p") == 0) { yydebug = 1; mmdebug = 1; } else { fprintf(stderr, "%s: -d Requires either an " "'s' or 'p' argument\n", appname); usage(); } #else stop("-d: Assembler not built with debugging " "information", EX_SOFTWARE); #endif break; case 'i': stock_include_file = optarg; break; case 'l': /* Create a program listing */ if ((listfile = fopen(optarg, "w")) == NULL) { perror(optarg); stop(NULL, EX_CANTCREAT); } listfilename = optarg; break; case 'n': /* Don't complain about the -nostdinc directrive */ if (strcmp(optarg, "ostdinc")) { fprintf(stderr, "%s: Unknown option -%c%s\n", appname, ch, optarg); usage(); /* NOTREACHED */ } break; case 'o': if ((ofile = fopen(optarg, "w")) == NULL) { perror(optarg); stop(NULL, EX_CANTCREAT); } ofilename = optarg; break; case 'p': /* Create Register Diagnostic "printing" Functions */ if ((regdiagfile = fopen(optarg, "w")) == NULL) { perror(optarg); stop(NULL, EX_CANTCREAT); } regdiagfilename = optarg; break; case 'r': if ((regfile = fopen(optarg, "w")) == NULL) { perror(optarg); stop(NULL, EX_CANTCREAT); } regfilename = optarg; break; case 'I': { path_entry_t include_dir; if (strcmp(optarg, "-") == 0) { if (includes_search_curdir == 0) { fprintf(stderr, "%s: Warning - '-I-' " "specified multiple " "times\n", appname); } includes_search_curdir = 0; for (include_dir = SLIST_FIRST(&search_path); include_dir != NULL; include_dir = SLIST_NEXT(include_dir, links)) /* * All entries before a '-I-' only * apply to includes specified with * quotes instead of "<>". */ include_dir->quoted_includes_only = 1; } else { include_dir = (path_entry_t)malloc(sizeof(*include_dir)); if (include_dir == NULL) { perror(optarg); stop(NULL, EX_OSERR); } include_dir->directory = strdup(optarg); if (include_dir->directory == NULL) { perror(optarg); stop(NULL, EX_OSERR); } include_dir->quoted_includes_only = 0; SLIST_INSERT_HEAD(&search_path, include_dir, links); } break; } case '?': default: usage(); /* NOTREACHED */ } } argc -= optind; argv += optind; if (argc != 1) { fprintf(stderr, "%s: No input file specifiled\n", appname); usage(); /* NOTREACHED */ } if (regdiagfile != NULL && (regfile == NULL || stock_include_file == NULL)) { fprintf(stderr, "%s: The -p option requires the -r and -i options.\n", appname); usage(); /* NOTREACHED */ } symtable_open(); inputfilename = *argv; include_file(*argv, SOURCE_FILE); retval = yyparse(); if (retval == 0) { if (SLIST_FIRST(&scope_stack) == NULL || SLIST_FIRST(&scope_stack)->type != SCOPE_ROOT) { stop("Unterminated conditional expression", EX_DATAERR); /* NOTREACHED */ } /* Process outmost scope */ process_scope(SLIST_FIRST(&scope_stack)); /* * Decend the tree of scopes and insert/emit * patches as appropriate. We perform a depth first * tranversal, recursively handling each scope. */ /* start at the root scope */ dump_scope(SLIST_FIRST(&scope_stack)); /* Patch up forward jump addresses */ back_patch(); if (ofile != NULL) output_code(); if (regfile != NULL) symtable_dump(regfile, regdiagfile); if (listfile != NULL) output_listing(inputfilename); } stop(NULL, 0); /* NOTREACHED */ return (0); }
int main(int argc, char *const *argv) { FILE *data = NULL; struct parameters p; char o, *tok, tmp[256]; word_t word; struct d_entry *d_entry; p.delimiters = NULL; STAILQ_INIT(&p.dictionary); // Initialisation des parametres while((o = getopt (argc, argv, "a:A:d:D:w:W:hHvV")) != -1) switch(o) { case 'w': case 'W': tok = strtok(optarg, " "); do { if((d_entry = (struct d_entry *) malloc(sizeof(struct d_entry)))) if((d_entry->string = (char *) calloc((strlen(tok) + 1), sizeof(char)))) { strcpy(d_entry->string, tok); STAILQ_INSERT_TAIL(&p.dictionary, d_entry, entries); } else { fprintf( stderr, "%s: Unable to create a dictionary entry for the word \"%s\": %s\n", *argv, tok, strerror(errno) ); free(d_entry); } else fprintf( stderr, "%s: Unable to create a dictionary entry for the word \"%s\": %s\n", *argv, tok, strerror(errno) ); } while((tok = strtok(NULL, " "))); break; case 'd': case 'D': p.delimiters = optarg; break; case 'h': case 'H': switch(system("cat help.txt")) { case 1: fprintf(stderr, "%s: \"help.txt\" does not exist", *argv); case -1: return EXIT_FAILURE; default: return EXIT_SUCCESS; break; } break; case 'v': case 'V': verbose = true; break; case '?': default: fprintf(stderr, "Usage: %s %s\n", *argv, USAGE); return EXIT_FAILURE; break; } // Chargement des dictionnaires while(optind < argc - 1) { if(!(data = fopen(argv[optind], "r"))) fprintf(stderr, "%s: %s\n", *argv, strerror(errno)); else { addWords(data, &p.dictionary); } fclose(data); optind++; } if(optind >= argc) { fprintf(stderr, "Usage: %s %s\n", *argv, USAGE); return EXIT_FAILURE; } // Chargement de l'automate if(!(data = fopen(argv[optind], "r"))) { fprintf(stderr, "%s: %s: %s\n", *argv, argv[optind], strerror(errno)); return EXIT_FAILURE; } if(!parse(data, &(p.fsm))) { fprintf(stderr, "%s: Unable to parse the automaton file\n", *argv); fclose(data); return EXIT_FAILURE; } fclose(data); // Lecture de mots sur l'entree standard if(STAILQ_EMPTY(&p.dictionary)) { while(printf("> "), scanf("%255[^\n]s\n", tmp)) { word = mkword(tmp, p.delimiters); printf("%s - %srecognized by the automaton\n", tmp, recognize(&p.fsm, word) ? "" : "un"); wfree(word); getchar(); } } // Lecture du dictionnaire while((d_entry = STAILQ_FIRST(&p.dictionary))) { word = mkword(d_entry->string, p.delimiters); printf("%s - %srecognized by the automaton\n", d_entry->string, recognize(&p.fsm, word) ? "" : "un"); wfree(word); STAILQ_REMOVE_HEAD(&p.dictionary, entries); free(d_entry->string); free(d_entry); } freeFsm(&(p.fsm)); return EXIT_SUCCESS; }
void pccard_check_cis_quirks(device_t dev) { struct pccard_softc *sc = (struct pccard_softc *) device_get_softc(dev); int wiped = 0; int i, j; struct pccard_function *pf, *pf_next, *pf_last; struct pccard_config_entry *cfe, *cfe_next; pf = NULL; pf_last = NULL; for (i=0; i<n_pccard_cis_quirks; i++) { if ((sc->card.manufacturer == pccard_cis_quirks[i].manufacturer) && (sc->card.product == pccard_cis_quirks[i].product) && (((sc->card.manufacturer != PCCARD_VENDOR_INVALID) && (sc->card.product != PCCARD_PRODUCT_INVALID)) || ((sc->card.manufacturer == PCCARD_VENDOR_INVALID) && (sc->card.product == PCCARD_PRODUCT_INVALID) && sc->card.cis1_info[0] && (strcmp(sc->card.cis1_info[0], pccard_cis_quirks[i].cis1_info[0]) == 0) && sc->card.cis1_info[1] && (strcmp(sc->card.cis1_info[1], pccard_cis_quirks[i].cis1_info[1]) == 0)))) { if (!wiped) { if (pccard_verbose) { device_printf(dev, "using CIS quirks for "); for (j = 0; j < 4; j++) { if (sc->card.cis1_info[j] == NULL) break; if (j) printf(", "); printf("%s", sc->card.cis1_info[j]); } printf("\n"); } for (pf = STAILQ_FIRST(&sc->card.pf_head); pf != NULL; pf = pf_next) { for (cfe = STAILQ_FIRST(&pf->cfe_head); cfe != NULL; cfe = cfe_next) { cfe_next = STAILQ_NEXT(cfe, cfe_list); free(cfe, M_DEVBUF); } pf_next = STAILQ_NEXT(pf, pf_list); free(pf, M_DEVBUF); } STAILQ_INIT(&sc->card.pf_head); wiped = 1; } if (pf_last == pccard_cis_quirks[i].pf) { cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT); *cfe = *pccard_cis_quirks[i].cfe; STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list); } else { pf = malloc(sizeof(*pf), M_DEVBUF, M_NOWAIT); *pf = *pccard_cis_quirks[i].pf; STAILQ_INIT(&pf->cfe_head); cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT); *cfe = *pccard_cis_quirks[i].cfe; STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list); STAILQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list); pf_last = pccard_cis_quirks[i].pf; } } } }
void os_eventq_init(struct os_eventq *evq) { memset(evq, 0, sizeof(*evq)); STAILQ_INIT(&evq->evq_list); }