Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  tsc.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <errno.h>
#include <inttypes.h>
#include <string.h>

#include <linux/compiler.h>
#include <linux/perf_event.h>
#include <linux/stddef.h>
#include <linux/types.h>

#include <asm/barrier.h>

#include "event.h"
#include "synthetic-events.h"
#include "debug.h"
#include "tsc.h"

u64 perf_time_to_tsc(u64 ns, struct perf_tsc_conversion *tc)
{
 u64 t, quot, rem;

 t = ns - tc->time_zero;
 quot = t / tc->time_mult;
 rem  = t % tc->time_mult;
 return (quot << tc->time_shift) +
        (rem << tc->time_shift) / tc->time_mult;
}

u64 tsc_to_perf_time(u64 cyc, struct perf_tsc_conversion *tc)
{
 u64 quot, rem;

 if (tc->cap_user_time_short)
  cyc = tc->time_cycles +
   ((cyc - tc->time_cycles) & tc->time_mask);

 quot = cyc >> tc->time_shift;
 rem  = cyc & (((u64)1 << tc->time_shift) - 1);
 return tc->time_zero + quot * tc->time_mult +
        ((rem * tc->time_mult) >> tc->time_shift);
}

int perf_read_tsc_conversion(const struct perf_event_mmap_page *pc,
        struct perf_tsc_conversion *tc)
{
 u32 seq;
 int i = 0;

 while (1) {
  seq = pc->lock;
  rmb();
  tc->time_mult = pc->time_mult;
  tc->time_shift = pc->time_shift;
  tc->time_zero = pc->time_zero;
  tc->time_cycles = pc->time_cycles;
  tc->time_mask = pc->time_mask;
  tc->cap_user_time_zero = pc->cap_user_time_zero;
  tc->cap_user_time_short = pc->cap_user_time_short;
  rmb();
  if (pc->lock == seq && !(seq & 1))
   break;
  if (++i > 10000) {
   pr_debug("failed to get perf_event_mmap_page lock\n");
   return -EINVAL;
  }
 }

 if (!tc->cap_user_time_zero)
  return -EOPNOTSUPP;

 return 0;
}

int perf_event__synth_time_conv(const struct perf_event_mmap_page *pc,
    const struct perf_tool *tool,
    perf_event__handler_t process,
    struct machine *machine)
{
 union perf_event event = {
  .time_conv = {
   .header = {
    .type = PERF_RECORD_TIME_CONV,
    .size = sizeof(struct perf_record_time_conv),
   },
  },
 };
 struct perf_tsc_conversion tc;
 int err;

 if (!pc)
  return 0;
 err = perf_read_tsc_conversion(pc, &tc);
 if (err == -EOPNOTSUPP)
  return 0;
 if (err)
  return err;

 pr_debug2("Synthesizing TSC conversion information\n");

 event.time_conv.time_mult  = tc.time_mult;
 event.time_conv.time_shift = tc.time_shift;
 event.time_conv.time_zero  = tc.time_zero;
 event.time_conv.time_cycles = tc.time_cycles;
 event.time_conv.time_mask = tc.time_mask;
 event.time_conv.cap_user_time_zero = tc.cap_user_time_zero;
 event.time_conv.cap_user_time_short = tc.cap_user_time_short;

 return process(tool, &event, NULL, machine);
}

u64 __weak rdtsc(void)
{
 return 0;
}

size_t perf_event__fprintf_time_conv(union perf_event *event, FILE *fp)
{
 struct perf_record_time_conv *tc = (struct perf_record_time_conv *)event;
 size_t ret;

 ret  = fprintf(fp, "\n... Time Shift %" PRI_lu64 "\n", tc->time_shift);
 ret += fprintf(fp, "... Time Multiplier %" PRI_lu64 "\n", tc->time_mult);
 ret += fprintf(fp, "... Time Zero %" PRI_lu64 "\n", tc->time_zero);

 /*
 * The event TIME_CONV was extended for the fields from "time_cycles"
 * when supported cap_user_time_short, for backward compatibility,
 * prints the extended fields only if they are contained in the event.
 */

 if (event_contains(*tc, time_cycles)) {
  ret += fprintf(fp, "... Time Cycles %" PRI_lu64 "\n",
          tc->time_cycles);
  ret += fprintf(fp, "... Time Mask %#" PRI_lx64 "\n",
          tc->time_mask);
  ret += fprintf(fp, "... Cap Time Zero %" PRId32 "\n",
          tc->cap_user_time_zero);
  ret += fprintf(fp, "... Cap Time Short %" PRId32 "\n",
          tc->cap_user_time_short);
 }

 return ret;
}

Messung V0.5
C=78 H=99 G=88

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge