/* * core_init_mmu_map - init tee core default memory mapping * * this routine sets the static default tee core mapping. * * If an error happend: core_init_mmu_map is expected to reset. */ void core_init_mmu_map(void) { struct tee_mmap_region *map; size_t n; for (n = 0; n < ARRAY_SIZE(secure_only); n++) { if (pbuf_intersects(nsec_shared, secure_only[n].paddr, secure_only[n].size)) panic("Invalid memory access config: sec/nsec"); } if (!mem_map_inited) init_mem_map(static_memory_map, ARRAY_SIZE(static_memory_map)); map = static_memory_map; while (map->type != MEM_AREA_NOTYPE) { switch (map->type) { case MEM_AREA_TEE_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) panic("TEE_RAM can't fit in secure_only"); map_tee_ram = map; break; case MEM_AREA_TA_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) panic("TA_RAM can't fit in secure_only"); map_ta_ram = map; break; case MEM_AREA_NSEC_SHM: if (!pbuf_is_inside(nsec_shared, map->pa, map->size)) panic("NS_SHM can't fit in nsec_shared"); map_nsec_shm = map; break; case MEM_AREA_IO_SEC: case MEM_AREA_IO_NSEC: case MEM_AREA_RAM_SEC: case MEM_AREA_RAM_NSEC: case MEM_AREA_RES_VASPACE: break; default: EMSG("Uhandled memtype %d", map->type); panic(); } map++; } /* Check that we have the mandatory memory areas defined */ if (!map_tee_ram || !map_ta_ram || !map_nsec_shm) panic("mandatory area(s) not found"); core_init_mmu_tables(static_memory_map); }
int main(int argc, char *argv[]) { int sockServer,sock_client,yes = 1; uint64_t command = 600000; pthread_t thread; uint32_t IDN=0xb00b; uint32_t status; void *(*handler[3])(void *) = { ctrl_handler, rx_handler, tx_handler }; struct sockaddr_in addr; if (argc >=2 ) { if (argv[1][0]=='v' ) verbose = 1; if (argv[1][0]=='V' ) verbose = 2; } if(init_mem_map()) { perror("memory mapping"); return EXIT_FAILURE; } //put logic into reset *((uint32_t *)(cfg + 0)) &= ~0xf; if(init_temperature_scale()) { perror("temperature scale"); return EXIT_FAILURE; } if((sockServer = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return EXIT_FAILURE; } setsockopt(sockServer, SOL_SOCKET, SO_REUSEADDR, (void *)&yes , sizeof(yes)); /* setup listening address */ memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(TCP_PORT); if(bind(sockServer, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return EXIT_FAILURE; } listen(sockServer, 1024); signal(SIGINT, signal_handler); while(!interrupted) { int result, selector; if(verbose)printf("waiting for client\n"); if((sock_client = accept(sockServer, NULL, NULL)) < 0) { perror("accept"); return 1; } if(verbose)printf("new connection, waiting for command\n"); result = recv(sock_client, (char *)&command, sizeof(command), MSG_WAITALL); if(result >= sizeof(command) ) { switch(command >> 60) { case CMD_IDN: if(verbose)printf("MAIN: IDN query, socket=%d\n",sock_client); status=*((uint32_t *)(sts + 8)); if(verbose)printf("Status = %u\n", status); status = ( status & 0xffff0000 ) | (IDN & 0x0000ffff ); if(send(sock_client, &status, sizeof(status), 0) < 0){ perror("send");break;} close(sock_client); break; case CMD_CONNECT: if((selector = command & 0x3)<3) { if(sock_thread[selector] > -1) { int ret; if(verbose)printf("MAIN: closing thread connection sock=%d\n",sock_thread[selector]); ret=shutdown(sock_thread[selector],SHUT_RDWR); while(sock_thread[selector] > -1) usleep(1000); if(verbose)printf("MAIN: shutdown ret = %d, command = %llx, now sock=%d\n",ret,command,sock_thread[selector]); } sock_thread[selector] = sock_client; if(pthread_create(&thread, NULL, handler[selector], NULL) < 0) { perror("pthread_create"); return EXIT_FAILURE; } pthread_detach(thread); } break; case CMD_STOP: close(sock_client); clean_up(); if(verbose)printf("Exit program\n"); return 0; break; default: if(verbose)printf("Unexpected command, closing connection, socket = %d\n",sock_client); close(sock_client); break; } } else { if(verbose)printf("Unexpected communication, closing connection, socket = %d\n",sock_client); close(sock_client); } }
void init_mm() { check_total_memory(); init_mem_map(); }