/shark/trunk/tracer/include/tracer.h |
---|
63,6 → 63,9 |
#include <ll/i386/hw-instr.h> |
#include "FTrace.h" |
#define TRACER_NO_OUTPUT 0 |
#define TRACER_UDP_OUTPUT 1 |
#define TRACER_LOGEVENT fast_logevent |
int tracer_initialize(int OutputType, int MemorySize); |
90,6 → 93,7 |
extern int TracerActive; |
extern unsigned long long TracerEventsRecorded; |
extern unsigned int TracerEventsSaved; |
SYS_FLAGS f; |
120,12 → 124,14 |
if (flag & 3) size += 4; |
// Adjust FirstTracerBuffer |
if (FirstTracerBuffer != StartTracerBuffer) { |
if (FirstTracerBuffer >= CurrentTracerBuffer && TracerEventsSaved != 0) { |
while ((CurrentTracerBuffer + size - 1) >= FirstTracerBuffer && |
FirstTracerBuffer != StartTracerBuffer) { |
FirstTracerBuffer += *(BYTE *)(FirstTracerBuffer + 9); |
if (FirstTracerBuffer >= LastBeforeEndTracerBuffer) FirstTracerBuffer = StartTracerBuffer; |
} |
} else { |
TracerEventsSaved++; |
} |
// Check if we overcome EndTracerBuffer |
/shark/trunk/tracer/newtrace/tracer.c |
---|
8,7 → 8,9 |
void *FirstTracerBuffer; //The First Valid Event |
int TracerActive = 0; |
int TracerOutputType = TRACER_NO_OUTPUT; |
unsigned long long TracerEventsRecorded; |
unsigned int TracerEventsSaved; |
extern unsigned int clk_per_msec; |
/* Initialize the tracer |
36,7 → 38,10 |
TracerActive = 0; |
TracerEventsRecorded = 0; |
TracerEventsSaved = 0; |
TracerOutputType = OutputType; |
ll_frestore(f); |
return 0; |
66,6 → 71,60 |
} |
int send_udp_event(void *p, int size); |
/* Send NumberOfEvents out of the system |
* If NumberOfEvents = -1 all the events will be sent */ |
int send_logged_data(unsigned int NumberOfEvents) { |
void *p; |
int s,err; |
SYS_FLAGS f; |
f = ll_fsave(); |
if (NumberOfEvents == 0 || TracerEventsSaved == 0) { |
ll_frestore(f); |
return 0; |
} |
p = FirstTracerBuffer; |
s = 0; |
while(((p == CurrentTracerBuffer && s == 0) || p != CurrentTracerBuffer) && s != NumberOfEvents) { |
switch (TracerOutputType) { |
case TRACER_NO_OUTPUT: |
break; |
case TRACER_UDP_OUTPUT: |
err = send_udp_event(p,*(BYTE *)(p + 9)); |
if (err != 0) { |
ll_frestore(f); |
return s; |
} |
break; |
default: |
cprintf("Error: Tracer Output Not Defined\n"); |
ll_frestore(f); |
return -1; |
break; |
} |
p += *(BYTE *)(p + 9); |
if (p >= LastBeforeEndTracerBuffer) p = StartTracerBuffer; |
FirstTracerBuffer = p; |
TracerEventsSaved--; |
s++; |
} |
ll_frestore(f); |
return s; |
} |
void tracer_print_statistics() { |
SYS_FLAGS f; |
81,6 → 140,7 |
cprintf("Last Before End Tracer Buffer: %08x\n\n",(int)LastBeforeEndTracerBuffer); |
cprintf("Total Events: %d\n",(int)TracerEventsRecorded); |
cprintf("Total Saved Events: %d\n",TracerEventsSaved); |
for (i=0; i<0xFF; i++) { |
p = FirstTracerBuffer; |
96,8 → 156,6 |
cprintf("Event type %02x => %d\n",i,t); |
} |
cprintf("Total Saved Events: %d\n",s); |
ll_frestore(f); |
} |
/shark/trunk/tracer/newtrace/udp.c |
---|
0,0 → 1,108 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* Copyright (C) 2002 Paolo Gai |
* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 2 of the License, or |
* (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* |
*/ |
#include <ll/sys/types.h> |
#include <stdlib.h> |
#define UDP_MAXSIZE 1400 |
struct tracer_udp_header { |
char id[12]; |
unsigned int pkt_number; |
unsigned int number_of_events; |
unsigned int total_size; |
}; |
int send_udp_event(void *p, int size) { |
static BYTE pkt[UDP_MAXSIZE]; |
static BYTE *current = pkt; |
static int total_pkt_size = 0; |
static int events_number = 0; |
static int packet_number = 0; |
struct tracer_udp_header head = {"TRACER-V1.0",0,0,0}; |
struct tracer_udp_header *phead = (struct tracer_udp_header *)(pkt); |
int err; |
if (total_pkt_size + size < UDP_MAXSIZE) { |
if (total_pkt_size == 0) { |
memcpy(pkt,&head,sizeof(struct tracer_udp_header)); |
current = pkt; |
current += sizeof(struct tracer_udp_header); |
total_pkt_size += sizeof(struct tracer_udp_header); |
phead->total_size = total_pkt_size; |
packet_number++; |
phead->pkt_number = packet_number; |
} |
events_number++; |
phead->number_of_events = events_number; |
total_pkt_size += size; |
phead->total_size = total_pkt_size; |
//Copy the event |
memcpy(current,p,size); |
current += size; |
return 0; |
} else { |
//err = udp_sentto(); |
events_number = 0; |
total_pkt_size = 0; |
current = pkt; |
send_udp_event(p,size); |
return err; |
} |
return -1; |
} |
/shark/trunk/tracer/makefile |
---|
16,7 → 16,7 |
# Object files |
ifeq ($(findstring NEW,$(TRACER)) , NEW) |
OBJS = newtrace/tracer.o |
OBJS = newtrace/tracer.o newtrace/udp.o |
CFG_OPT += -D__NEW_TRACER__ |
endif |
ifeq ($(findstring OLD,$(TRACER)) , OLD) |