You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
364 lines
7.7 KiB
364 lines
7.7 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
/* This verifies that the interceptsegv_for_oaddr_cache.test ran as expected by analyzing
|
|
the oaddr cache info activity in the pin.log file produced by the test
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <signal.h>
|
|
#include <assert.h>
|
|
#include <setjmp.h>
|
|
#include <sys/types.h>
|
|
|
|
|
|
#define MAX_STR 4096
|
|
char line[MAX_STR];
|
|
int numInvalidations = 0;
|
|
int numFinds = 0;
|
|
int numFindsAfterInvalidation = 0;
|
|
|
|
void VerifyAndExit()
|
|
{
|
|
if (numInvalidations > 0 && numFinds > 0 && numFindsAfterInvalidation > 0)
|
|
{
|
|
exit (0);
|
|
}
|
|
else
|
|
{
|
|
if (numInvalidations <= 0)
|
|
{
|
|
printf ("** error expected to have some invalidations\n");
|
|
}
|
|
if (numFinds <= 0)
|
|
{
|
|
printf ("** error expected to have some finds\n");
|
|
}
|
|
if (numFindsAfterInvalidation <= 0)
|
|
{
|
|
printf ("** error expected to have some finds after invalidation\n");
|
|
}
|
|
exit (-1);
|
|
}
|
|
}
|
|
|
|
char *AdvanceToBlank (char *ptr)
|
|
{
|
|
while (*ptr != ' ')
|
|
{
|
|
ptr++;
|
|
}
|
|
return (ptr);
|
|
}
|
|
|
|
char *AdvanceToNonBlank (char *ptr)
|
|
{
|
|
while (*ptr == ' ')
|
|
{
|
|
ptr++;
|
|
}
|
|
return (ptr);
|
|
}
|
|
|
|
int readln (FILE *fp, char *target)
|
|
{
|
|
int i = 0;
|
|
memset (target, 0, MAX_STR);
|
|
while (1) {
|
|
target[i] = fgetc (fp);
|
|
if (EOF == target[i]) {
|
|
target[i] = '\n';
|
|
return (EOF);
|
|
}
|
|
if ('\n' == target[i]) {
|
|
target[i] = ' ';
|
|
target[i+1] = 0;
|
|
break;
|
|
}
|
|
/*
|
|
if (0xa == target[i]) {
|
|
break;
|
|
}
|
|
if (0xd == target[i]) {
|
|
break;
|
|
}
|
|
*/
|
|
i++;
|
|
}
|
|
return (EOF+1);
|
|
}
|
|
|
|
#define MAX_CRBS 8
|
|
char curOaddr[32];
|
|
struct crb
|
|
{
|
|
char name[32];
|
|
char ccEntryName[32];
|
|
char oaddrName[32];
|
|
};
|
|
struct crb crbs[MAX_CRBS];
|
|
int numCrbs = 0;
|
|
|
|
|
|
/*
|
|
ptr points to -> <- endPtr points to
|
|
ccd: New cachedOaddrInfo 0xfeb660 for oaddr 0x604f6c ccEntry is 0x66c054 ccEntry iaddr 0x804853f ccEntry oaddr 0x604f58
|
|
*/
|
|
|
|
void RecordNewCachedOaddrInfo(char *ptr, char *endPtr)
|
|
{
|
|
int i;
|
|
|
|
*endPtr = 0;
|
|
|
|
crbs[numCrbs].name[0] = 0;
|
|
crbs[numCrbs].ccEntryName[0] = 0;
|
|
crbs[numCrbs].oaddrName[0] = 0;
|
|
|
|
strcpy (crbs[numCrbs].name, ptr);
|
|
*endPtr = ' ';
|
|
ptr = strstr (ptr, "is");
|
|
if (ptr==NULL)
|
|
{
|
|
printf ("** error could not find ccEntry is\n");
|
|
exit (-1);
|
|
}
|
|
ptr = AdvanceToBlank(ptr);
|
|
ptr = AdvanceToNonBlank(ptr);
|
|
endPtr = AdvanceToBlank(ptr);
|
|
*endPtr = 0;
|
|
strcpy (crbs[numCrbs].ccEntryName, ptr);
|
|
*endPtr = ' ';
|
|
strcpy (crbs[numCrbs].oaddrName, curOaddr);
|
|
printf ("** new cachedRegBindings# %d name %s ccEntryName %s oaddrName %s\n",
|
|
numCrbs, crbs[numCrbs].name, crbs[numCrbs].ccEntryName, crbs[numCrbs].oaddrName);
|
|
|
|
|
|
/* verify we do not have this recorded - if it is then it should have been found */
|
|
for (i=0; i<numCrbs; i++)
|
|
{
|
|
if (!strcmp(crbs[numCrbs].oaddrName, crbs[i].oaddrName))
|
|
{
|
|
printf ("** error found entry for same oaddrName at cachedOaddrInfo# %d\n", i);
|
|
exit (-1);
|
|
}
|
|
}
|
|
numCrbs++;
|
|
}
|
|
|
|
|
|
|
|
void HandleLookup(char *line)
|
|
{
|
|
char *endPtr;
|
|
printf ("%s\n", line);
|
|
char *ptr = strstr (line, "0x");
|
|
if (ptr == NULL)
|
|
{
|
|
exit (-1);
|
|
}
|
|
endPtr = AdvanceToBlank (ptr);
|
|
*endPtr = '\0';
|
|
strcpy(curOaddr, ptr);
|
|
}
|
|
|
|
/*
|
|
ccd: New cachedRegBindings 0xfeb660 for oaddr 0x604f6c ccEntry is 0x66c054 ccEntry iaddr 0x804853f ccEntry oaddr 0x604f58
|
|
*/
|
|
void HandleNew(char * line)
|
|
{
|
|
|
|
char *ptr = strstr (line,"cachedRegBindings");
|
|
char *endPtr;
|
|
printf ("%s\n", line);
|
|
printf ("** New cachedRegBindings:\n");
|
|
if (ptr==NULL)
|
|
{
|
|
printf ("** error could not find cachedRegBindings\n");
|
|
exit(-1);
|
|
}
|
|
ptr = AdvanceToBlank (ptr);
|
|
ptr = AdvanceToNonBlank (ptr);
|
|
endPtr = AdvanceToBlank (ptr);
|
|
RecordNewCachedOaddrInfo (ptr, endPtr);
|
|
|
|
}
|
|
|
|
/*
|
|
ccd: Found cachedRegBindings 0xfeb660
|
|
*/
|
|
void HandleFound(char *line)
|
|
{
|
|
|
|
char *ptr = strstr (line, "cachedRegBindings");
|
|
char *endPtr;
|
|
int found = 0;
|
|
int i, theCrbs, x;
|
|
printf ("%s\n", line);
|
|
if (ptr==NULL)
|
|
{
|
|
printf ("** error could not find cachedRegBindings\n");
|
|
exit(-1);
|
|
}
|
|
ptr = AdvanceToBlank (ptr);
|
|
ptr = AdvanceToNonBlank (ptr);
|
|
endPtr = AdvanceToBlank (ptr);
|
|
*endPtr = 0;
|
|
for (i=0; i<numCrbs; i++)
|
|
{
|
|
if (!strcmp(crbs[i].name, ptr))
|
|
{
|
|
found = 1;
|
|
theCrbs = i;
|
|
break;
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
printf ("** error could not find a valid cachedRegBindings with name %s\n", ptr);
|
|
exit (-1);
|
|
}
|
|
if (strcmp(crbs[theCrbs].oaddrName, curOaddr))
|
|
{
|
|
printf ("** error cachedRegBindings# %d has different oaddr %s %s\n",
|
|
theCrbs, crbs[theCrbs].oaddrName, curOaddr);
|
|
exit (-1);
|
|
}
|
|
|
|
numFinds++;
|
|
if (numInvalidations>0)
|
|
{
|
|
numFindsAfterInvalidation++;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
ccd: Invalidate ccEntry 0x2cd054
|
|
ccd: Remove cachedRegBindings 0x124700 ccEntry is 0x2cd054 ccEntry iaddr 0x804853f
|
|
*/
|
|
void HandleInvalidate (char *line, FILE *fp)
|
|
{
|
|
char *ptr;
|
|
char * endPtr;
|
|
int i, x;
|
|
int numFound;
|
|
|
|
printf ("\n%s\n", line);
|
|
x = readln (fp, line);
|
|
if (x == EOF)
|
|
{
|
|
printf ("** error unexpected EOF100\n");
|
|
exit (-1);
|
|
}
|
|
printf ("%s\n", line);
|
|
ptr = strstr (line, "RemoveEntriesInRange oaddr");
|
|
if (ptr==NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
x = readln (fp, line);
|
|
if (x == EOF)
|
|
{
|
|
printf ("** error unexpected EOF10\n");
|
|
exit (-1);
|
|
}
|
|
printf ("%s\n", line);
|
|
ptr = strstr (line, "None found");
|
|
if (ptr != NULL)
|
|
{
|
|
return;
|
|
}
|
|
ptr = strstr (line, "Remove cachedRegBindings");
|
|
if (ptr == NULL)
|
|
{
|
|
return;
|
|
}
|
|
ptr = strstr (line, "0x");
|
|
if (ptr == NULL)
|
|
{
|
|
printf ("** error could not find the address of the cachedRegBinding\n");
|
|
exit (-1);
|
|
}
|
|
endPtr = AdvanceToBlank(ptr);
|
|
*endPtr = '\0';
|
|
numFound = 0;
|
|
for (i=0; i<numCrbs; i++)
|
|
{
|
|
if (!strcmp(crbs[i].name, ptr))
|
|
{
|
|
crbs[i].name[0] = 0;
|
|
numFound++;
|
|
}
|
|
}
|
|
if (numFound != 1)
|
|
{
|
|
printf ("** error did not expect to find %d etries to invalidate\n", numFound);
|
|
exit (-1);
|
|
}
|
|
numInvalidations++;
|
|
}
|
|
}
|
|
|
|
int main (int argc, char*argv[])
|
|
{
|
|
int x;
|
|
|
|
|
|
FILE *fp = fopen (argv[1], "r");
|
|
if (fp==NULL)
|
|
{
|
|
printf ("** error could not open pin logfile: %s\n", argv[1]);
|
|
exit(-1);
|
|
}
|
|
x = readln (fp, line);
|
|
if (x == EOF)
|
|
{
|
|
printf ("** error unexpected EOF100\n");
|
|
exit (-1);
|
|
}
|
|
while(1)
|
|
{
|
|
|
|
if (strstr (line, "Lookup"))
|
|
{
|
|
HandleLookup (line);
|
|
}
|
|
else if (strstr (line, "New"))
|
|
{
|
|
HandleNew (line);
|
|
}
|
|
else if (strstr (line, "Invalidate ccEntry"))
|
|
{
|
|
HandleInvalidate (line, fp);
|
|
}
|
|
else if (strstr (line, "Found"))
|
|
{
|
|
HandleFound (line);
|
|
}
|
|
|
|
x = readln (fp, line);
|
|
if (x == EOF)
|
|
{
|
|
VerifyAndExit();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|