Commit 90b66b34 authored by Ramon Nou's avatar Ramon Nou
Browse files

extra parameters and README

parent 407e3f6e
Loading
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
build/
+12 −0
Original line number Diff line number Diff line
@@ -48,6 +48,18 @@ target_sources(opendevnull
        src/opendevnull.cpp
)

# Include path from Syscall_intercept into opendevnull
target_include_directories(opendevnull
    PRIVATE
        ${Syscall_intercept_INCLUDE_DIR}
)

# Link libraries
target_link_libraries(
    opendevnull
    Syscall_intercept::Syscall_intercept
)

target_link_libraries(
    eval_intercept
    Syscall_intercept::Syscall_intercept

Readme.md

0 → 100644
+0 −0

Empty file added.

+107 −42
Original line number Diff line number Diff line

#include <fcntl.h>
#include <iostream>
#include <cmath>
#include <sys/syscall.h>
#include <unistd.h>

#include <libsyscall_intercept_hook_point.h>

// Default number of repetitions
double reps = 1000.0 * 100000.0;
int repext = 1000;
int repint = 100000;
bool always_syscall =
    false;            // whether to call the original syscall after the hook
bool verbose = false; // whether to print debug messages

int main(int argc, char *argv[]) {
    // Check if the correct number of arguments is provided
    if (argc != 3) {
        std::cerr << "Usage: " << argv[0] << " --syscall <open|getpid>" << std::endl;
  // Parse command-line arguments
  std::string syscall;
  for (int i = 1; i < argc; ++i) {
    std::string arg = argv[i];
    if (arg == "--syscall") {
      if (i + 1 < argc) {
        syscall = argv[++i];
      } else {
        std::cerr << "Error: --syscall requires an argument" << std::endl;
        return 1;
      }
    } else if (arg == "--reps") {
      if (i + 1 < argc) {
        reps = atof(argv[++i]);
        if (reps <= 0) {
          std::cerr << "Error: --reps requires a positive integer" << std::endl;
          return 1;
        }
      } else {
        std::cerr << "Error: --reps requires an argument" << std::endl;
        return 1;
      }
    } else if (arg == "--always_syscall") {
      always_syscall = true;
    } else if (arg == "--verbose") {
      verbose = true;
    } else {
      std::cerr << "Error: Unknown option '" << arg << "'" << std::endl;
      return 1;
    }
  }

  const int inner_loop_size = 1000000; // Size of the inner loop (1 million)
  int repext =
      static_cast<int>(reps / inner_loop_size); // Outer loop iterations
  int repint = inner_loop_size;                     // Inner loop iterations
  double remainder =
      std::fmod(reps, inner_loop_size); // Remaining iterations

  // Validate that --syscall is provided
  if (syscall.empty()) {
    std::cerr << "Error: --syscall is required" << std::endl;
    return 1;
  }

  // measure time to run in microseconds
  
  std::string option = argv[1];
  std::string syscall = argv[2];

  double reps = 1000.0*100000.0;
  // Handle the --syscall option
  if (option == "--syscall") {
  if (syscall == "open") {

    struct timespec start, end;
    clock_gettime(CLOCK_MONOTONIC, &start);

      for (int j = 0; j < 1000; j++) {
        for (int i = 0; i < 100000; i++) {
    for (int i = 0; i < repext; ++i) {
      for (int j = 0; j < repint; ++j) {
        int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0);
        if (verbose) {
          std::cout << "open() returned " << fd << std::endl;
        }

        close(fd);
      }
    }
    for (int j = 0; j < remainder; ++j) {
      int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0);
      if (verbose) {
        std::cout << "open() returned " << fd << std::endl;
      }
      close(fd);
    }

    clock_gettime(CLOCK_MONOTONIC, &end);
    double time_taken =
        (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3;


    std::cout << "Mean time taken: " << time_taken / reps << " microseconds"
              << std::endl;
    }
    else if (syscall == "getpid") {
  } else if (syscall == "getpid") {
    struct timespec start, end;
    clock_gettime(CLOCK_MONOTONIC, &start);

            for (int j = 0; j < 1000; j++) {
              for (int i = 0; i < 100000; i++) {
    for (int i = 0; i < repext; ++i) {
      for (int j = 0; j < repint; ++j) {
        int ret = getpid();
        if (verbose) {
          std::cout << "getpid() returned " << ret << std::endl;
        }
        if (always_syscall) {
          syscall_no_intercept(SYS_getpid);
        }
      }
    }

    for (int j = 0; j < remainder; ++j) {
      int ret = getpid();
      if (verbose) {
        std::cout << "getpid() returned " << ret << std::endl;
      }
      if (always_syscall) {
        syscall_no_intercept(SYS_getpid);
      }
    }

    clock_gettime(CLOCK_MONOTONIC, &end);
    double time_taken =
        (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3;


    std::cout << "Mean time taken: " << time_taken / reps << " microseconds"
              << std::endl;
  }
  }

  return 0;
}