Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Mar 2012 23:26:08 +0530
From:      Maninya M <maninya@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   __NR_mmap2 in FreeBSD
Message-ID:  <CAC46K3kjQyqQ0VvjP%2BUwQkSooqbT1HR=SVYUpz8KQ1CcYovaEA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
I am trying to convert a function written for Linux to FreeBSD.
What is the equivalent of the __NR_mmap2 system call in FreeBSD?

I keep getting the error because of this exception:
warn("Wanted space at address 0x%.8x, mmap2 system call returned 0x%.8x.
This could be a problem.",addr,temp_regs.eax);

I changed
temp_regs.eax = __NR_mmap2;
to
temp_regs.eax = 192;

but it didn't work. I suppose I couldn't understand this function. Please
help.

This is the function:

void map_memory(unsigned long addr, unsigned long size, int flags)
{
  int status;
  struct user_regs_struct regs,temp_regs;
  unsigned long int_instr = 0x000080cd; /* INT 0x80 */

  if (ptrace(PTRACE_GETREGS,exec_pid,NULL,&regs) < 0)
    die_perror("ptrace(PTRACE_GETREGS,%d,NULL,&regs)",exec_pid);

  /* mmap2 system call seems to take arguments as follows:
   * eax = __NR_mmap2
   * ebx = (unsigned long) page aligned address
   * ecx = (unsigned long) page aligned file size
   * edx = protection
   * esi = flags
   * Other arguments (fd and pgoff) are not required for anonymous mapping
   */
  temp_regs = regs;
  temp_regs.eax = __NR_mmap2;
  temp_regs.ebx = addr;
  temp_regs.ecx = size;
  temp_regs.edx = flags;
  temp_regs.esi = MAP_PRIVATE | MAP_ANONYMOUS;
  temp_regs.eip = temp_regs.esp - 4;

  if (ptrace(PTRACE_POKETEXT,exec_pid,(void
*)(temp_regs.eip),(void*)int_instr) < 0)
    die_perror("ptrace(PTRACE_POKETEXT,%d,0x%.8x,INT 0x80) failed while
allocating memory",exec_pid,temp_regs.eip);
  if (ptrace(PTRACE_SETREGS,exec_pid,NULL,&temp_regs) < 0) {
    die_perror("ptrace(PTRACE_SETREGS,%d,...) failed while allocating
memory",exec_pid);
  }
  if (ptrace(PTRACE_SINGLESTEP,exec_pid,NULL,NULL) < 0)
    die_perror("ptrace(PTRACE_SINGLESTEP,...) failed while executing
mmap2");

  wait(&status);
  if (WIFEXITED(status))
    die("Restarted process abrubtly (exited with value %d). Aborting
Restart.",WEXITSTATUS(status));
  else if (WIFSIGNALED(status))
    die("Restarted process abrubtly exited because of uncaught signal (%d).
Aborting Restart.",WTERMSIG(status));

  if (ptrace(PTRACE_GETREGS,exec_pid,NULL,&temp_regs) < 0) {
    die_perror("ptrace(PTRACE_GETREGS,...) failed after executing mmap2
system call");
  }

  if (temp_regs.eax != addr)
    warn("Wanted space at address 0x%.8x, mmap2 system call returned
0x%.8x. This could be a problem.",addr,temp_regs.eax);
  else if (cr_options.verbose)
    fprintf(stdout,"Successfully allocated [0x%.8lx -
0x%.8lx]\n",addr,addr+size);

  /* Restore original registers */
  if (ptrace(PTRACE_SETREGS,exec_pid,NULL,&regs) < 0) {
    die_perror("ptrace(PTRACE_SETREGS,...) when restoring registering after
allocating memory (mmap2)");
  }
}

-- 
Maninya



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAC46K3kjQyqQ0VvjP%2BUwQkSooqbT1HR=SVYUpz8KQ1CcYovaEA>