void l2_cache_fill(int cpu_num, unsigned long long int addr, int set, int way, int prefetch, unsigned long long int evicted_addr)
{
  // uncomment this line to see the information available to you when there is a cache fill event
  //printf("0x%llx %d %d %d 0x%llx\n", addr, set, way, prefetch, evicted_addr);

  cache_insert(addr, prefetch);
  if (prefetch==1) {
    prefetch_tot_num++;


    // Insert Evicted address into pollution filter
    // only if it is not prefetch
    int found = cache_search(evicted_addr);
    if (found == -1) {
      if (evicted_addr != 0) {
      printf("ERROR: evicted address not in the cache - %llx \n", evicted_addr);
      exit(1);
      }
    }
    else 
      if (cache[found].pf != 1)
        poll_insert(evicted_addr);

    poll_remove(addr);
    
  }

  cache_remove(evicted_addr);
  
}
int uart_incoming_data(short revents)
{
	int i;

	unsigned char buf[FIFO_SIZE];
	/* Check OOB first */

	int r;
	r = recv(clientsockfd,buf,sizeof(buf),MSG_OOB);
	if (r>0) {
		fprintf(stderr,"OOB data %d\n",r);
		handle_escape(buf[0]);
		return 0;
	}

	r = recv(clientsockfd,buf,sizeof(buf),0);



	fprintf(stderr,"UART read %d\n",r);

	if (r>0) {
		i=0;
		pthread_mutex_lock(&fifo_lock);
		while (r--) {
            /*
			if (uartescape) {
				uartescape=0;
				if (buf[i]!=0xff) {
					fprintf(stderr,"Escape sequence: 0x%02x\n",buf[i]);
                    handle_escape(buf[i]);
					i++;
					continue;
				}
			} else {
				if (buf[i]==0xff) {
					uartescape=1;
					i++;
					continue;
				}
			}
            */
			fifodata[highmark]=buf[i];
			i++;
			highmark++;
			if (highmark>=FIFO_SIZE)
				highmark=0;
			if (highmark==lowmark) {
				printf("UART: FIFO overrun\n");
				pthread_mutex_unlock(&fifo_lock);
				abort();
			}
		}
	} else {
		poll_remove(clientsockfd);
		printf("Disconnected\n");
		clientsockfd=-1;
	}
	pthread_mutex_unlock(&fifo_lock);
	return 0;
}
Exemple #3
0
void server_process(struct pollfd *fds, int num)
{
	int i = 0;

	for(i = 0; i < server_max_pollfd; ++i) {
		if(fds[i].revents == 0) {
			continue;
		}
		if(fds[i].fd == sock_fd) {
			if(fds[i].revents & POLLIN) {
				int data_fd;
				struct sockaddr_in clnt;
				int clnt_len = sizeof(clnt);
				memset(&clnt, 0, sizeof(clnt));
				if((data_fd = accept(sock_fd, (struct sockaddr*)&clnt, &clnt_len)) < 0) {
					perror("accept");
				}
				char clnt_addr[16] = "";
				inet_ntop(AF_INET, &clnt.sin_addr, clnt_addr, sizeof(clnt_addr));
				printf("[%s] connected\n", clnt_addr);
				poll_add(data_fd);
			}
			if(fds[i].revents & POLLERR) {
				printf("error occured\n");
			}
			if(fds[i].revents & POLLNVAL) {
				printf("invalid request\n");
			}
		}
		else {
			if(fds[i].revents & POLLIN) {
				char clnt_addr[16] = "";
				struct sockaddr_in clnt;
				int clnt_len = sizeof(clnt);
				if(getpeername(fds[i].fd, (struct sockaddr*)&clnt, &clnt_len) < 0) {
					perror("getpeername");
				}
				inet_ntop(AF_INET, &clnt.sin_addr, clnt_addr, sizeof(clnt_addr));
				int recv_data = 0;
				int recv_cnt = 0;
				recv_cnt = recv(fds[i].fd, &recv_data, sizeof(recv_data), 0);
				if(recv_cnt > 0) {
					printf("receive [%d] from [%s]\n", recv_data, clnt_addr);
				}
				else if(recv_cnt == 0) {
					printf("[%s] disconnected\n\n", clnt_addr);
					close(fds[i].fd);
					poll_remove(i);
				}
				else if(recv_cnt == -1) {
					perror("recv");
				}
			}
			if(fds[i].revents & POLLOUT) {
				printf("ready to write data\n");
			}
			if(fds[i].revents & POLLERR) {
				printf("error occured\n");
			}
			if(fds[i].revents & POLLNVAL) {
				printf("invalid request\n");
			}
			if(fds[i].revents & POLLHUP) {
				printf("pollhup\n");
			}
			if(fds[i].revents & POLLRDHUP) {
				printf("pollrdhup\n");
			}
		}
	}
}