linux/arch/um/sys-ppc/miscthings.c
<<
>>
Prefs
   1#include "linux/threads.h"
   2#include "linux/stddef.h"  // for NULL
   3#include "linux/elf.h"  // for AT_NULL
   4
   5/* The following function nicked from arch/ppc/kernel/process.c and
   6 * adapted slightly */
   7/*
   8 * XXX ld.so expects the auxiliary table to start on
   9 * a 16-byte boundary, so we have to find it and
  10 * move it up. :-(
  11 */
  12void shove_aux_table(unsigned long sp)
  13{
  14        int argc;
  15        char *p;
  16        unsigned long e;
  17        unsigned long aux_start, offset;
  18
  19        argc = *(int *)sp;
  20        sp += sizeof(int) + (argc + 1) * sizeof(char *);
  21        /* skip over the environment pointers */
  22        do {
  23                p = *(char **)sp;
  24                sp += sizeof(char *);
  25        } while (p != NULL);
  26        aux_start = sp;
  27        /* skip to the end of the auxiliary table */
  28        do {
  29                e = *(unsigned long *)sp;
  30                sp += 2 * sizeof(unsigned long);
  31        } while (e != AT_NULL);
  32        offset = ((aux_start + 15) & ~15) - aux_start;
  33        if (offset != 0) {
  34                do {
  35                        sp -= sizeof(unsigned long);
  36                        e = *(unsigned long *)sp;
  37                        *(unsigned long *)(sp + offset) = e;
  38                } while (sp > aux_start);
  39        }
  40}
  41/* END stuff taken from arch/ppc/kernel/process.c */
  42
  43
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.