static int my_nanosleep(struct timespec *ts){ uint64_t freq = 600000000ULL; uint64_t tdiff = (ts->tv_sec * freq) + ((ts->tv_nsec * freq) / 1000000000ULL); uint64_t now = __k1_read_dsu_timestamp(); while(now + tdiff > __k1_read_dsu_timestamp()) __k1_cpu_backoff(1000); return 0; }
static inline odp_time_t get_time(void) { odp_time_t time; time.cycles = __k1_read_dsu_timestamp(); #ifdef DSU_DIVISOR time.cycles *= __k1_read_dsu_timestamp_divisor(); #endif return time; }
static int send_recv(odp_packet_t packet, int send_nb, int expt_nb) { static int test_id = 0; printf("send_recv %d\n", test_id++); odp_pktio_t pktio; odp_queue_t outq_def; odp_packet_t pkt_tbl[MAX_PKT_BURST]; pktio = odp_pktio_lookup(pktio_valid_name); if (pktio == ODP_PKTIO_INVALID) { printf("Error: lookup of pktio %s failed\n", pktio_valid_name); return 1; } outq_def = odp_pktio_outq_getdef(pktio); if (outq_def == ODP_QUEUE_INVALID) { printf("Error: def output-Q query\n"); return 1; } int i; for ( i = 0; i < send_nb; ++i ) { odp_queue_enq(outq_def, (odp_event_t)packet); } int ret = 0; int start = __k1_read_dsu_timestamp(); while ( ret >= 0 && ret < expt_nb && ( __k1_read_dsu_timestamp() - start ) < 10 * __bsp_frequency ) { int n_pkt = odp_pktio_recv(pktio, pkt_tbl, MAX_PKT_BURST); ret += n_pkt; if (n_pkt > 0) odp_packet_free_multi(pkt_tbl, n_pkt); } test_assert_ret(ret == expt_nb); odp_packet_free(packet); printf("send_recv %d OK\n", test_id); return 0; }
static int my_nanosleep(struct timespec *ts){ uint64_t freq = __bsp_frequency; uint64_t tdiff = (ts->tv_sec * freq) + ((ts->tv_nsec * freq) / 1000000000ULL); #ifdef MAGIC_SCALL uint64_t divisor = __k1_read_dsu_timestamp_divisor(); uint64_t dsu_ts = __k1_read_dsu_timestamp(); uint64_t cc = dsu_ts * divisor; uint64_t target = cc + tdiff;; return __k1_syscall2(MAGIC_SCALL_SLEEP, target & 0xffffffffULL, target >> 32); #else while(tdiff > INT32_MAX){ __k1_cpu_backoff(INT32_MAX); tdiff -= INT32_MAX; } __k1_cpu_backoff(tdiff); return 0; #endif }