blob: 6437c281e2dcc855cc1052c4cf88c9a81e2fd94b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
******************************************************************************/
package org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel;
import java.util.Collections;
import java.util.List;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelTrace;
import org.eclipse.tracecompass.internal.analysis.os.linux.core.SyscallLookup;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCallsiteAspect;
import org.eclipse.tracecompass.tmf.core.event.lookup.ITmfCallsite;
import org.eclipse.tracecompass.tmf.core.event.lookup.TmfCallsite;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
/**
* Get the source location of known trace points.
*
* @author Matthew Khouzam
*/
public final class KernelCallsiteAspect extends TmfCallsiteAspect {
private static @Nullable KernelCallsiteAspect sInstance = null;
/**
* Get the singleton instance
*
* @return the instance
*/
public static KernelCallsiteAspect getInstance() {
KernelCallsiteAspect instance = sInstance;
if (instance == null) {
instance = new KernelCallsiteAspect();
sInstance = instance;
}
return instance;
}
private KernelCallsiteAspect() {
// do nothing
}
@Override
public @Nullable List<ITmfCallsite> resolve(ITmfEvent event) {
ITmfTrace trace = event.getTrace();
if (trace instanceof IKernelTrace) {
IKernelAnalysisEventLayout layout = ((IKernelTrace) trace).getKernelEventLayout();
String syscallName = truncateEntry(layout, event.getName());
if (syscallName == null) {
syscallName = truncateExit(layout, event.getName());
}
if (syscallName != null) {
String file = SyscallLookup.getInstance().getFile(syscallName);
if (!file.isEmpty()) {
return Collections.<ITmfCallsite> singletonList(new TmfCallsite(file, Long.valueOf(0)));
}
}
}
return null;
}
private static @Nullable String truncateEntry(IKernelAnalysisEventLayout layout, String syscallName) {
if (syscallName.startsWith(layout.eventCompatSyscallEntryPrefix())) {
return syscallName.substring(layout.eventCompatSyscallEntryPrefix().length());
} else if (syscallName.startsWith(layout.eventSyscallEntryPrefix())) {
return syscallName.substring(layout.eventSyscallEntryPrefix().length());
}
return null;
}
private static @Nullable String truncateExit(IKernelAnalysisEventLayout layout, String syscallName) {
if (syscallName.startsWith(layout.eventCompatSyscallExitPrefix())) {
return syscallName.substring(layout.eventCompatSyscallExitPrefix().length());
} else if (syscallName.startsWith(layout.eventSyscallExitPrefix())) {
return syscallName.substring(layout.eventSyscallExitPrefix().length());
}
return null;
}
}