Skip to content

Commit 367f19c

Browse files
authored
Merge pull request #22 from sy-c/master
improved RDH dump
2 parents d1cdffd + 5cbae21 commit 367f19c

File tree

3 files changed

+108
-4
lines changed

3 files changed

+108
-4
lines changed

src/RdhUtils.cxx

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ RdhHandle::~RdhHandle(){
99
void RdhHandle::dumpRdh() {
1010
printf("RDH @ 0x%p\n",(void *)rdhPtr);
1111
printf("Version = 0x%02X\n",(int)getHeaderVersion());
12-
printf("Block length = %d bytes\n",(int)getBlockLength());
12+
printf("Header size = %d\n",(int)getHeaderSize());
13+
printf("Block length (link) = %d bytes\n",(int)getBlockLength());
14+
printf("Block length (memory) = %d bytes\n",(int)getMemorySize());
1315
printf("FEE Id = %d\n",(int)getFeeId());
1416
printf("Link Id = %d\n",(int)getLinkId());
15-
printf("Header size = %d\n",(int)getHeaderSize());
17+
printf("Next block = %d\n",(int)getOffsetNextPacket());
1618
//printf("%04X %04X %04X %04X\n",rdhPtr->word3,rdhPtr->word2,rdhPtr->word1,rdhPtr->word0);
1719
}
1820

@@ -42,3 +44,69 @@ int RdhHandle::validateRdh(std::string &err) {
4244
// check FEE Id ?
4345
return retCode;
4446
}
47+
48+
49+
RdhBlockHandle::RdhBlockHandle(void *ptr, size_t size) : blockPtr(ptr), blockSize(size) {
50+
}
51+
52+
RdhBlockHandle::~RdhBlockHandle() {
53+
}
54+
55+
int RdhBlockHandle::printSummary() {
56+
printf("\n\n************************\n");
57+
printf("Start of page %p (%d bytes)\n\n",blockPtr,blockSize);
58+
59+
// intialize start of block
60+
uint8_t *ptr=(uint8_t *)(blockPtr);
61+
size_t bytesLeft=blockSize;
62+
63+
int rdhcount=0;
64+
65+
for (;;) {
66+
67+
// check enough space for RDH
68+
if (bytesLeft<sizeof(o2::Header::RAWDataHeader)) {
69+
printf("page too small, %d bytes left! need at least %d bytes for RDH\n",bytesLeft,(int)sizeof(o2::Header::RAWDataHeader));
70+
return -1;
71+
}
72+
73+
rdhcount++;
74+
int offset=ptr-(uint8_t*)blockPtr;
75+
printf("*** RDH #%d @ 0x%04X = %d\n",rdhcount,offset,offset);
76+
77+
// print raw bytes
78+
//printf("Raw bytes dump (32-bit words):\n");
79+
for (int i=0;i<sizeof(o2::Header::RAWDataHeader)/sizeof(int32_t);i++) {
80+
if (i%8==0) {printf("\n");}
81+
printf("%08X ",(int)(((uint32_t*)ptr)[i]));
82+
}
83+
printf("\n\n");
84+
85+
RdhHandle rdh(ptr);
86+
rdh.dumpRdh();
87+
printf("\n");
88+
89+
int next=rdh.getOffsetNextPacket(); // next RDH
90+
if (next==0) {
91+
break;
92+
}
93+
94+
// check enough space to go to next offset
95+
if (bytesLeft<next) {
96+
printf("page too small, %d bytes left! need at least %d bytes for next offset\n",bytesLeft,(int)rdh.getOffsetNextPacket());
97+
return -1;
98+
}
99+
100+
101+
bytesLeft-=next;
102+
ptr+=next;
103+
if (bytesLeft==0) {
104+
break;
105+
}
106+
}
107+
108+
printf("End of page %p (%d bytes)",blockPtr,blockSize);
109+
printf("\n************************\n\n");
110+
111+
return 0;
112+
}

src/RdhUtils.h

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,35 @@ class RdhHandle {
4141
}
4242
inline uint32_t getHbOrbit() {
4343
return (uint32_t) rdhPtr->heartbeatOrbit;
44-
}
45-
44+
}
45+
inline uint16_t getMemorySize() {
46+
return (uint16_t) rdhPtr->memorySize;
47+
}
48+
inline uint16_t getOffsetNextPacket() {
49+
return (uint16_t) rdhPtr->offsetNextPacket;
50+
}
51+
inline bool getStopBit() {
52+
return (bool) rdhPtr->stopBit;
53+
}
4654
private:
4755
o2::Header::RAWDataHeader *rdhPtr; // pointer to RDH in memory
4856
};
57+
58+
59+
// Utility class to access/parse/check the content of a contiguous memory block consisting of RDH+data
60+
class RdhBlockHandle {
61+
public:
62+
// create a handle to the block, providing pointer and size
63+
RdhBlockHandle(void *blockPtr, size_t size);
64+
65+
// destructor
66+
~RdhBlockHandle();
67+
68+
// print summary
69+
// return 0 on success, an error code if the block is invalid
70+
int printSummary();
71+
72+
private:
73+
void *blockPtr; // pointer to beginning of memory block
74+
size_t blockSize; // size of memory block
75+
};

src/ReadoutEquipmentRORC.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,15 @@ DataBlockContainerReference ReadoutEquipmentRORC::getNextBlock() {
362362
// checks to do:
363363
// - HB clock consistent in all RDHs
364364
// - increasing counters
365+
if (cfgRdhDumpEnabled) {
366+
RdhBlockHandle b(d->getData()->data,d->getData()->header.dataSize);
367+
if (b.printSummary()) {
368+
printf("errors detected, suspending RDH dump\n");
369+
cfgRdhDumpEnabled=0;
370+
} else {
371+
cfgRdhDumpEnabled++; //if value positive, it continues... but negative, it stops on zero, to limit number of dumps
372+
}
373+
}
365374

366375
if (cfgRdhCheckEnabled) {
367376
std::string errorDescription;

0 commit comments

Comments
 (0)