----- Original Message -----
> From: [email protected]
> To: "Jan Stancek" <[email protected]>
> Cc: [email protected]
> Sent: Monday, 18 August, 2014 11:59:31 AM
> Subject: Re: [LTP] [PATCH] profil01: rewrite testcase
>
> Hi!
> > +/*
> > + * Copyright (c) International Business Machines Corp., 2002
> > + * Copyright (C) 2014 Linux Test Project, Inc.
> > + *
> > + * 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.
> > + */
> > +/*
> > + * ALGORITHM
> > + * Set up a profiling buffer, turn profiling on, set a timer for
> > + * cpu time, spin the pc and wait for timer to go off.
> > + * The profiling buffer should contain some info, highly concentrated.
> > + * We just do a "looks reasonable" check.
> > + */
> > +
> > +#include <stdio.h>
> > +#include <signal.h>
> > +#include <unistd.h>
> > +#include <errno.h>
> > +#include <sys/types.h>
> > +#include "test.h"
> > +#include "safe_macros.h"
> > +#include "usctest.h"
> > +
> > +#define PROFIL_TIME 5
> > +
> > +/* should be large enough to hold data for test_profil() .text
> > + * on x86_64 this is ~600 bytes, so 16k should enough for all arches */
> > +#define PROFIL_BUFLEN (16*1024)
> > +#define PROFIL_BUFSZ (16*1024*sizeof(short))
> > +
> > +char *TCID = "profil01";
> > +int TST_TOTAL = 1;
> > +
> > +#ifndef __UCLIBC__
>
> We can add profil to FILTER_OUT_DIRS for UCLINUX into the
> kernel/syscalls/Makefile and drop these ifdefs completly.
It seems to be there already.
>
> > +static volatile sig_atomic_t profil_done;
> > +
> > +static void alrm_handler(int sig)
> > +{
> > + (void) sig;
> > + profil_done = 1;
> > +}
> > +
> > +static void test_profil(void)
> > +{
> > + unsigned short buf[PROFIL_BUFSZ] = { 0 };
> ^
> PROFIL_BUFLEN ?
Right, I started with malloc and forgot to change this.
> > + size_t offset = (size_t) &test_profil, count = 0;
> > + int ret, i, data[8];
> > +
> > + /* make data depend on runtime value, so gcc can't make assumptions */
> > + memset(data, getpid(), sizeof(data));
> > +
> > + /* reset for test looping */
> > + profil_done = 0;
> > +
> > + /* profil_count in glibc calculates offset as
> > + * i = (pc - pc_offset - (void *) 0) / 2
> > + * i = i * pc_scale / 65536
> > + * set scale to 2*65536 to have 1:1 mapping for $pc */
> > + ret = profil(buf, PROFIL_BUFSZ, offset, 2*65536);
> ^ ^
> sizeof(buf) ? why 2* ?
profil_count() formula divides by 2, I'm not sure why.
It doesn't make a big difference for test, but it made it easier when
comparing output from testcase with disassembled code.
> > + if (ret)
> > + tst_brkm(TBROK, NULL, "profil returned: %d\n", ret);
> > +
> > + signal(SIGALRM, alrm_handler);
> > + alarm(PROFIL_TIME);
> > +
> > + while (!profil_done) {
> > + if (data[0])
> > + data[0] = -data[7];
> > + else
> > + data[1] = data[0] / 2;
> > + if (data[2])
> > + data[2] = data[1] * 2;
> > + else
> > + data[3] = data[2] + data[0];
> > + if (data[4])
> > + data[4] = data[3] - data[1];
> > + else
> > + data[5] = data[4] * data[2];
> > + if (data[6])
> > + data[6] = data[5] + data[3];
> > + else
> > + data[7] = data[6] - data[4];
> > + }
> > +
> > + for (i = 0; i < PROFIL_BUFLEN; i++)
> > + if (buf[i]) {
> > + tst_resm(TINFO, "buf[0x%04x]=%d", i, buf[i]);
> > + count += buf[i];
> > + }
> > +
> > + if (count > 0) {
> > + tst_resm(TPASS, "profil recorded some data");
> > + } else {
> > + /* don't let gcc optimize data away, use it */
> > + tst_resm(TINFO, "data[7]: %d", data[7]);
>
> It may be more future proof to mark the data as volatile
> instead of assuming something about the compiler.
>
> --
> Cyril Hrubis
> [email protected]
>
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list