void idle_loop(void) { for ( ; ; ) { if ( cpu_is_offline(smp_processor_id()) ) stop_cpu(); local_irq_disable(); if ( cpu_is_haltable(smp_processor_id()) ) { dsb(sy); wfi(); } local_irq_enable(); do_tasklet(); do_softirq(); } }
void idle_loop(void) { for ( ; ; ) { if ( cpu_is_offline(smp_processor_id()) ) stop_cpu(); local_irq_disable(); if ( cpu_is_haltable(smp_processor_id()) ) { dsb(sy); wfi(); } local_irq_enable(); do_tasklet(); do_softirq(); /* * We MUST be last (or before dsb, wfi). Otherwise after we get the * softirq we would execute dsb,wfi (and sleep) and not patch. */ check_for_livepatch_work(); } }
static void noreturn halt_this_cpu(void *arg) { stop_cpu(); }
int main(int argc,char **argv) { start_time=time(0); start_usec=gettime_us(); int opt; while ((opt = getopt(argc, argv, "b:s:l:c:")) != -1) { switch (opt) { case 'l': strcpy(serial_port,optarg); break; case 's': serial_speed=atoi(optarg); switch(serial_speed) { case 1000000: case 1500000: case 4000000: case 230400: case 2000000: break; default: usage(); } break; case 'b': bitstream=strdup(optarg); break; case 'c': queue_command(optarg); break; default: /* '?' */ usage(); } } if (argc-optind==1) usage(); // Load bitstream if file provided if (bitstream) { char cmd[1024]; snprintf(cmd,1024,"fpgajtag -a %s",bitstream); fprintf(stderr,"%s\n",cmd); system(cmd); fprintf(stderr,"[T+%lldsec] Bitstream loaded\n",(long long)time(0)-start_time); } #ifndef APPLE // Try to set USB serial port to low latency { char latency_timer[1024]; int offset=strlen(serial_port); while(offset&&serial_port[offset-1]!='/') offset--; snprintf(latency_timer,1024,"/sys/bus/usb-serial/devices/%s/latency_timer", &serial_port[offset]); int old_latency=999; FILE *f=fopen(latency_timer,"r"); if (f) { fscanf(f,"%d",&old_latency); fclose(f); } if (old_latency!=1) { snprintf(latency_timer,1024,"echo 1 | sudo tee /sys/bus/usb-serial/devices/%s/latency_timer", &serial_port[offset]); printf("Attempting to reduce USB latency via '%s'\n",latency_timer); system(latency_timer); } } // And also another way struct serial_struct serial; ioctl(fd, TIOCGSERIAL, &serial); serial.flags |= ASYNC_LOW_LATENCY; ioctl(fd, TIOCSSERIAL, &serial); #endif errno=0; fd=open(serial_port,O_RDWR); if (fd==-1) { fprintf(stderr,"Could not open serial port '%s'\n",serial_port); perror("open"); exit(-1); } fcntl(fd,F_SETFL,fcntl(fd, F_GETFL, NULL)|O_NONBLOCK); // Set higher speed on serial interface to improve throughput set_speed(fd,2000000); slow_write(fd,"\r+9\r",4,5000); set_speed(fd,4000000); stop_cpu(); sdhc_check(); if (queued_command_count) { for(int i=0;i<queued_command_count;i++) execute_command(queued_commands[i]); return 0; } else { char *cmd=NULL; while((cmd=readline("MEGA65 SD-card> "))!=NULL) { execute_command(cmd); } } return 0; }
void measure(void) { int c, cmin, cmax, ncpus; int cfd = -1; cmin = 0; cmax = (int)sysconf(_SC_NPROCESSORS_ONLN); ncpus = cmax; if (options.cpu != -1) { cmin = options.cpu; cmax = cmin + 1; } all_fds = malloc(ncpus * sizeof(perf_event_desc_t *)); if (!all_fds) err(1, "cannot allocate memory for all_fds"); if (options.cgroup_name) { cfd = open_cgroup(options.cgroup_name); if (cfd == -1) exit(1); } for(c=cmin ; c < cmax; c++) setup_cpu(c, cfd); printf("<press CTRL-C to quit before %ds time limit>\n", options.delay); /* * FIX this for hotplug CPU */ if (options.interval) { struct timespec tv; int delay; for (delay = 1 ; delay <= options.delay; delay++) { for(c=cmin ; c < cmax; c++) start_cpu(c); if (0) { tv.tv_sec = 0; tv.tv_nsec = 100000000; nanosleep(&tv, NULL); } else sleep(1); for(c=cmin ; c < cmax; c++) stop_cpu(c); for(c = cmin; c < cmax; c++) { printf("# %'ds -----\n", delay); read_cpu(c); } } } else { for(c=cmin ; c < cmax; c++) start_cpu(c); sleep(options.delay); if (0) for(c=cmin ; c < cmax; c++) stop_cpu(c); for(c = cmin; c < cmax; c++) { printf("# -----\n"); read_cpu(c); } } for(c = cmin; c < cmax; c++) close_cpu(c); free(all_fds); }
int main(int argc, char** argv) { int fd, n; unsigned long loadaddr; char* p; char m4IsStopped = 0; char m4IsRunning = 0; int m4TraceFlags = 0; int m4Retry; char* filepath = argv[1]; int currentSoC = -1; if (argc < 2) { LogError(HEADER); LogError("-- %s -- \nUsage:\n" "%s [filename.bin] [0xLOADADDR] [--verbose] # loads new firmware\n" "or: %s stop # holds the auxiliary core in reset\n" "or: %s start # releases the auxiliary core from reset\n" "or: %s kick [n] # triggers interrupt on RPMsg virtqueue n\n", NAME_OF_UTILITY, argv[0], argv[0], argv[0], argv[0], argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } currentSoC = get_board_id(); if (currentSoC == -1) { LogError(HEADER); LogError("Board is not supported.\n"); return RETURN_CODE_ARGUMENTS_ERROR; } fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { LogError(HEADER); LogError("Could not open /dev/mem, are you root?\n"); return RETURN_CODE_ARGUMENTS_ERROR; } /* PARTIAL COMMANDS */ if (!strcmp(argv[1], "stop")) { stop_cpu(fd, currentSoC); return RETURN_CODE_OK; } else if (!strcmp(argv[1], "start")) { start_cpu(fd, currentSoC); return RETURN_CODE_OK; } else if (!strcmp(argv[1], "kick")) { if (argc < 3) { LogError(HEADER); LogError("%s - Usage: %s kick {vq_id to kick}\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } rpmsg_mu_kick(fd, currentSoC, strtoul(argv[2], &p, 16)); return RETURN_CODE_OK; } /* FW LOADING */ if (argc < 3) { LogError(HEADER); LogError("%s - Usage: %s [yourfwname.bin] [0xLOADADDR] [--verbose]\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } if (access(filepath, F_OK) == -1) { LogError("File %s not found.\n", argv[1]); return RETURN_CODE_ARGUMENTS_ERROR; } loadaddr = strtoul(argv[2], &p, 16); if (argc == 4) { if (!strcmp(argv[3], "--verbose")) { verbose = 1; } else { LogError(HEADER); LogError("%s - Usage: %s [yourfwname.bin] [0xLOADADDR] [--verbose]\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } } LogVerbose("LoadAddr is: %X\n", loadaddr); LogVerbose("Will stop CPU now...\n"); stop_cpu(fd, currentSoC); LogVerbose("Will ungate M4 clock source...\n"); ungate_m4_clk(fd, currentSoC); LogVerbose("Will load M4 firmware...\n"); load_m4_fw(fd, currentSoC, filepath, loadaddr); LogVerbose("Will start CPU now...\n"); start_cpu(fd, currentSoC); LogVerbose("Done!\n"); close(fd); return RETURN_CODE_OK; }