mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-10-29 23:28:52 +01:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
28
arch/um/include/shared/aio.h
Normal file
28
arch/um/include/shared/aio.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef AIO_H__
|
||||
#define AIO_H__
|
||||
|
||||
enum aio_type { AIO_READ, AIO_WRITE, AIO_MMAP };
|
||||
|
||||
struct aio_thread_reply {
|
||||
void *data;
|
||||
int err;
|
||||
};
|
||||
|
||||
struct aio_context {
|
||||
int reply_fd;
|
||||
struct aio_context *next;
|
||||
};
|
||||
|
||||
#define INIT_AIO_CONTEXT { .reply_fd = -1, \
|
||||
.next = NULL }
|
||||
|
||||
extern int submit_aio(enum aio_type type, int fd, char *buf, int len,
|
||||
unsigned long long offset, int reply_fd,
|
||||
struct aio_context *aio);
|
||||
|
||||
#endif
|
||||
15
arch/um/include/shared/arch.h
Normal file
15
arch/um/include/shared/arch.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_H__
|
||||
#define __ARCH_H__
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
|
||||
extern void arch_check_bugs(void);
|
||||
extern int arch_fixup(unsigned long address, struct uml_pt_regs *regs);
|
||||
extern void arch_examine_signal(int sig, struct uml_pt_regs *regs);
|
||||
|
||||
#endif
|
||||
65
arch/um/include/shared/as-layout.h
Normal file
65
arch/um/include/shared/as-layout.h
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __START_H__
|
||||
#define __START_H__
|
||||
|
||||
#include <generated/asm-offsets.h>
|
||||
|
||||
/*
|
||||
* Stolen from linux/const.h, which can't be directly included since
|
||||
* this is used in userspace code, which has no access to the kernel
|
||||
* headers. Changed to be suitable for adding casts to the start,
|
||||
* rather than "UL" to the end.
|
||||
*/
|
||||
|
||||
/* Some constant macros are used in both assembler and
|
||||
* C code. Therefore we cannot annotate them always with
|
||||
* 'UL' and other type specifiers unilaterally. We
|
||||
* use the following macros to deal with this.
|
||||
*/
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#define _UML_AC(X, Y) (Y)
|
||||
#else
|
||||
#define __UML_AC(X, Y) (X(Y))
|
||||
#define _UML_AC(X, Y) __UML_AC(X, Y)
|
||||
#endif
|
||||
|
||||
#define STUB_START _UML_AC(, 0x100000)
|
||||
#define STUB_CODE _UML_AC((unsigned long), STUB_START)
|
||||
#define STUB_DATA _UML_AC((unsigned long), STUB_CODE + UM_KERN_PAGE_SIZE)
|
||||
#define STUB_END _UML_AC((unsigned long), STUB_DATA + UM_KERN_PAGE_SIZE)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
|
||||
struct cpu_task {
|
||||
int pid;
|
||||
void *task;
|
||||
};
|
||||
|
||||
extern struct cpu_task cpu_tasks[];
|
||||
|
||||
extern unsigned long high_physmem;
|
||||
extern unsigned long uml_physmem;
|
||||
extern unsigned long uml_reserved;
|
||||
extern unsigned long end_vm;
|
||||
extern unsigned long start_vm;
|
||||
extern unsigned long long highmem;
|
||||
|
||||
extern unsigned long brk_start;
|
||||
|
||||
extern unsigned long host_task_size;
|
||||
|
||||
extern int linux_main(int argc, char **argv);
|
||||
|
||||
struct siginfo;
|
||||
extern void (*sig_info[])(int, struct siginfo *si, struct uml_pt_regs *);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
41
arch/um/include/shared/common-offsets.h
Normal file
41
arch/um/include/shared/common-offsets.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/* for use by sys-$SUBARCH/kernel-offsets.c */
|
||||
|
||||
DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
|
||||
|
||||
DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE);
|
||||
DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
|
||||
DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT);
|
||||
DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC);
|
||||
|
||||
DEFINE(UM_ELF_CLASS, ELF_CLASS);
|
||||
DEFINE(UM_ELFCLASS32, ELFCLASS32);
|
||||
DEFINE(UM_ELFCLASS64, ELFCLASS64);
|
||||
|
||||
DEFINE(UM_NR_CPUS, NR_CPUS);
|
||||
|
||||
DEFINE(UM_GFP_KERNEL, GFP_KERNEL);
|
||||
DEFINE(UM_GFP_ATOMIC, GFP_ATOMIC);
|
||||
|
||||
/* For crypto assembler code. */
|
||||
DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
|
||||
|
||||
DEFINE(UM_THREAD_SIZE, THREAD_SIZE);
|
||||
|
||||
DEFINE(UM_HZ, HZ);
|
||||
|
||||
DEFINE(UM_USEC_PER_SEC, USEC_PER_SEC);
|
||||
DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC);
|
||||
DEFINE(UM_NSEC_PER_USEC, NSEC_PER_USEC);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
DEFINE(UML_CONFIG_PRINTK, CONFIG_PRINTK);
|
||||
#endif
|
||||
#ifdef CONFIG_NO_HZ_COMMON
|
||||
DEFINE(UML_CONFIG_NO_HZ_COMMON, CONFIG_NO_HZ_COMMON);
|
||||
#endif
|
||||
#ifdef CONFIG_UML_X86
|
||||
DEFINE(UML_CONFIG_UML_X86, CONFIG_UML_X86);
|
||||
#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
DEFINE(UML_CONFIG_64BIT, CONFIG_64BIT);
|
||||
#endif
|
||||
19
arch/um/include/shared/elf_user.h
Normal file
19
arch/um/include/shared/elf_user.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Fujitsu Siemens Computers GmbH
|
||||
* Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __ELF_USER_H__
|
||||
#define __ELF_USER_H__
|
||||
|
||||
/* For compilation on a host that doesn't support AT_SYSINFO (Linux 2.4) */
|
||||
|
||||
#ifndef AT_SYSINFO
|
||||
#define AT_SYSINFO 32
|
||||
#endif
|
||||
#ifndef AT_SYSINFO_EHDR
|
||||
#define AT_SYSINFO_EHDR 33
|
||||
#endif
|
||||
|
||||
#endif
|
||||
15
arch/um/include/shared/frame_kern.h
Normal file
15
arch/um/include/shared/frame_kern.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __FRAME_KERN_H_
|
||||
#define __FRAME_KERN_H_
|
||||
|
||||
extern int setup_signal_stack_sc(unsigned long stack_top, struct ksignal *ksig,
|
||||
struct pt_regs *regs, sigset_t *mask);
|
||||
extern int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
|
||||
struct pt_regs *regs, sigset_t *mask);
|
||||
|
||||
#endif
|
||||
|
||||
151
arch/um/include/shared/init.h
Normal file
151
arch/um/include/shared/init.h
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
#ifndef _LINUX_UML_INIT_H
|
||||
#define _LINUX_UML_INIT_H
|
||||
|
||||
/* These macros are used to mark some functions or
|
||||
* initialized data (doesn't apply to uninitialized data)
|
||||
* as `initialization' functions. The kernel can take this
|
||||
* as hint that the function is used only during the initialization
|
||||
* phase and free up used memory resources after
|
||||
*
|
||||
* Usage:
|
||||
* For functions:
|
||||
*
|
||||
* You should add __init immediately before the function name, like:
|
||||
*
|
||||
* static void __init initme(int x, int y)
|
||||
* {
|
||||
* extern int z; z = x * y;
|
||||
* }
|
||||
*
|
||||
* If the function has a prototype somewhere, you can also add
|
||||
* __init between closing brace of the prototype and semicolon:
|
||||
*
|
||||
* extern int initialize_foobar_device(int, int, int) __init;
|
||||
*
|
||||
* For initialized data:
|
||||
* You should insert __initdata between the variable name and equal
|
||||
* sign followed by value, e.g.:
|
||||
*
|
||||
* static int init_variable __initdata = 0;
|
||||
* static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
|
||||
*
|
||||
* Don't forget to initialize data not at file scope, i.e. within a function,
|
||||
* as gcc otherwise puts the data into the bss section and not into the init
|
||||
* section.
|
||||
*
|
||||
* Also note, that this data cannot be "const".
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_INIT_H
|
||||
typedef int (*initcall_t)(void);
|
||||
typedef void (*exitcall_t)(void);
|
||||
|
||||
#ifndef __KERNEL__
|
||||
#ifndef __section
|
||||
# define __section(S) __attribute__ ((__section__(#S)))
|
||||
#endif
|
||||
|
||||
#if __GNUC__ == 3
|
||||
|
||||
#if __GNUC_MINOR__ >= 3
|
||||
# define __used __attribute__((__used__))
|
||||
#else
|
||||
# define __used __attribute__((__unused__))
|
||||
#endif
|
||||
|
||||
#else
|
||||
#if __GNUC__ == 4
|
||||
# define __used __attribute__((__used__))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#else
|
||||
#include <linux/compiler.h>
|
||||
#endif
|
||||
/* These are for everybody (although not all archs will actually
|
||||
discard it in modules) */
|
||||
#define __init __section(.init.text)
|
||||
#define __initdata __section(.init.data)
|
||||
#define __exitdata __section(.exit.data)
|
||||
#define __exit_call __used __section(.exitcall.exit)
|
||||
|
||||
#ifdef MODULE
|
||||
#define __exit __section(.exit.text)
|
||||
#else
|
||||
#define __exit __used __section(.exit.text)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef MODULE
|
||||
struct uml_param {
|
||||
const char *str;
|
||||
int (*setup_func)(char *, int *);
|
||||
};
|
||||
|
||||
extern initcall_t __uml_initcall_start, __uml_initcall_end;
|
||||
extern initcall_t __uml_postsetup_start, __uml_postsetup_end;
|
||||
extern const char *__uml_help_start, *__uml_help_end;
|
||||
#endif
|
||||
|
||||
#define __uml_initcall(fn) \
|
||||
static initcall_t __uml_initcall_##fn __uml_init_call = fn
|
||||
|
||||
#define __uml_exitcall(fn) \
|
||||
static exitcall_t __uml_exitcall_##fn __uml_exit_call = fn
|
||||
|
||||
extern struct uml_param __uml_setup_start, __uml_setup_end;
|
||||
|
||||
#define __uml_postsetup(fn) \
|
||||
static initcall_t __uml_postsetup_##fn __uml_postsetup_call = fn
|
||||
|
||||
#define __non_empty_string(dummyname,string) \
|
||||
struct __uml_non_empty_string_struct_##dummyname \
|
||||
{ \
|
||||
char _string[sizeof(string)-2]; \
|
||||
}
|
||||
|
||||
#ifndef MODULE
|
||||
#define __uml_setup(str, fn, help...) \
|
||||
__non_empty_string(fn ##_setup, str); \
|
||||
__uml_help(fn, help); \
|
||||
static char __uml_setup_str_##fn[] __initdata = str; \
|
||||
static struct uml_param __uml_setup_##fn __uml_init_setup = { __uml_setup_str_##fn, fn }
|
||||
#else
|
||||
#define __uml_setup(str, fn, help...) \
|
||||
|
||||
#endif
|
||||
|
||||
#define __uml_help(fn, help...) \
|
||||
__non_empty_string(fn ##__help, help); \
|
||||
static char __uml_help_str_##fn[] __initdata = help; \
|
||||
static const char *__uml_help_##fn __uml_setup_help = __uml_help_str_##fn
|
||||
|
||||
/*
|
||||
* Mark functions and data as being only used at initialization
|
||||
* or exit time.
|
||||
*/
|
||||
#define __uml_init_setup __used __section(.uml.setup.init)
|
||||
#define __uml_setup_help __used __section(.uml.help.init)
|
||||
#define __uml_init_call __used __section(.uml.initcall.init)
|
||||
#define __uml_postsetup_call __used __section(.uml.postsetup.init)
|
||||
#define __uml_exit_call __used __section(.uml.exitcall.exit)
|
||||
|
||||
#ifndef __KERNEL__
|
||||
|
||||
#define __define_initcall(level,fn) \
|
||||
static initcall_t __initcall_##fn __used \
|
||||
__attribute__((__section__(".initcall" level ".init"))) = fn
|
||||
|
||||
/* Userspace initcalls shouldn't depend on anything in the kernel, so we'll
|
||||
* make them run first.
|
||||
*/
|
||||
#define __initcall(fn) __define_initcall("1", fn)
|
||||
|
||||
#define __exitcall(fn) static exitcall_t __exitcall_##fn __exit_call = fn
|
||||
|
||||
#define __init_call __used __section(.initcall.init)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_UML_INIT_H */
|
||||
18
arch/um/include/shared/irq_kern.h
Normal file
18
arch/um/include/shared/irq_kern.h
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __IRQ_KERN_H__
|
||||
#define __IRQ_KERN_H__
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
extern int um_request_irq(unsigned int irq, int fd, int type,
|
||||
irq_handler_t handler,
|
||||
unsigned long irqflags, const char * devname,
|
||||
void *dev_id);
|
||||
void um_free_irq(unsigned int irq, void *dev);
|
||||
#endif
|
||||
|
||||
31
arch/um/include/shared/irq_user.h
Normal file
31
arch/um/include/shared/irq_user.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __IRQ_USER_H__
|
||||
#define __IRQ_USER_H__
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
|
||||
struct irq_fd {
|
||||
struct irq_fd *next;
|
||||
void *id;
|
||||
int fd;
|
||||
int type;
|
||||
int irq;
|
||||
int events;
|
||||
int current_events;
|
||||
};
|
||||
|
||||
enum { IRQ_READ, IRQ_WRITE };
|
||||
|
||||
struct siginfo;
|
||||
extern void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
||||
extern void free_irq_by_fd(int fd);
|
||||
extern void reactivate_fd(int fd, int irqnum);
|
||||
extern void deactivate_fd(int fd, int irqnum);
|
||||
extern int deactivate_all_fds(void);
|
||||
extern int activate_ipi(int fd, int pid);
|
||||
|
||||
#endif
|
||||
22
arch/um/include/shared/kern.h
Normal file
22
arch/um/include/shared/kern.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __KERN_H__
|
||||
#define __KERN_H__
|
||||
|
||||
/* These are all user-mode things which are convenient to call directly
|
||||
* from kernel code and for which writing a wrapper is too much of a pain.
|
||||
* The regular include files can't be included because this file is included
|
||||
* only into kernel code, and user-space includes conflict with kernel
|
||||
* includes.
|
||||
*/
|
||||
|
||||
extern int printf(const char *fmt, ...);
|
||||
extern void *sbrk(int increment);
|
||||
extern int pause(void);
|
||||
extern void exit(int);
|
||||
|
||||
#endif
|
||||
|
||||
69
arch/um/include/shared/kern_util.h
Normal file
69
arch/um/include/shared/kern_util.h
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __KERN_UTIL_H__
|
||||
#define __KERN_UTIL_H__
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
#include <sysdep/faultinfo.h>
|
||||
|
||||
struct siginfo;
|
||||
|
||||
extern int uml_exitcode;
|
||||
|
||||
extern int ncpus;
|
||||
extern int kmalloc_ok;
|
||||
|
||||
#define UML_ROUND_UP(addr) \
|
||||
((((unsigned long) addr) + PAGE_SIZE - 1) & PAGE_MASK)
|
||||
|
||||
extern unsigned long alloc_stack(int order, int atomic);
|
||||
extern void free_stack(unsigned long stack, int order);
|
||||
|
||||
extern int do_signal(void);
|
||||
extern void interrupt_end(void);
|
||||
extern void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs);
|
||||
|
||||
extern unsigned long segv(struct faultinfo fi, unsigned long ip,
|
||||
int is_user, struct uml_pt_regs *regs);
|
||||
extern int handle_page_fault(unsigned long address, unsigned long ip,
|
||||
int is_write, int is_user, int *code_out);
|
||||
|
||||
extern unsigned int do_IRQ(int irq, struct uml_pt_regs *regs);
|
||||
extern int smp_sigio_handler(void);
|
||||
extern void initial_thread_cb(void (*proc)(void *), void *arg);
|
||||
extern int is_syscall(unsigned long addr);
|
||||
|
||||
extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
||||
|
||||
extern int start_uml(void);
|
||||
extern void paging_init(void);
|
||||
|
||||
extern void uml_cleanup(void);
|
||||
extern void do_uml_exitcalls(void);
|
||||
|
||||
/*
|
||||
* Are we disallowed to sleep? Used to choose between GFP_KERNEL and
|
||||
* GFP_ATOMIC.
|
||||
*/
|
||||
extern int __cant_sleep(void);
|
||||
extern int get_current_pid(void);
|
||||
extern int copy_from_user_proc(void *to, void *from, int size);
|
||||
extern int cpu(void);
|
||||
extern char *uml_strdup(const char *string);
|
||||
|
||||
extern unsigned long to_irq_stack(unsigned long *mask_out);
|
||||
extern unsigned long from_irq_stack(int nested);
|
||||
|
||||
extern void syscall_trace(struct uml_pt_regs *regs, int entryexit);
|
||||
extern int singlestepping(void *t);
|
||||
|
||||
extern void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
||||
extern void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs);
|
||||
extern void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
||||
extern void fatal_sigsegv(void) __attribute__ ((noreturn));
|
||||
|
||||
|
||||
#endif
|
||||
23
arch/um/include/shared/longjmp.h
Normal file
23
arch/um/include/shared/longjmp.h
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef __UML_LONGJMP_H
|
||||
#define __UML_LONGJMP_H
|
||||
|
||||
#include <sysdep/archsetjmp.h>
|
||||
#include <os.h>
|
||||
|
||||
extern int setjmp(jmp_buf);
|
||||
extern void longjmp(jmp_buf, int);
|
||||
|
||||
#define UML_LONGJMP(buf, val) do { \
|
||||
longjmp(*buf, val); \
|
||||
} while(0)
|
||||
|
||||
#define UML_SETJMP(buf) ({ \
|
||||
int n; \
|
||||
volatile int enable; \
|
||||
enable = get_signals(); \
|
||||
n = setjmp(*buf); \
|
||||
if(n != 0) \
|
||||
set_signals(enable); \
|
||||
n; })
|
||||
|
||||
#endif
|
||||
22
arch/um/include/shared/mem.h
Normal file
22
arch/um/include/shared/mem.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __MEM_H__
|
||||
#define __MEM_H__
|
||||
|
||||
extern int phys_mapping(unsigned long phys, unsigned long long *offset_out);
|
||||
|
||||
extern unsigned long uml_physmem;
|
||||
static inline unsigned long to_phys(void *virt)
|
||||
{
|
||||
return(((unsigned long) virt) - uml_physmem);
|
||||
}
|
||||
|
||||
static inline void *to_virt(unsigned long phys)
|
||||
{
|
||||
return((void *) uml_physmem + phys);
|
||||
}
|
||||
|
||||
#endif
|
||||
62
arch/um/include/shared/mem_user.h
Normal file
62
arch/um/include/shared/mem_user.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* arch/um/include/mem_user.h
|
||||
*
|
||||
* BRIEF MODULE DESCRIPTION
|
||||
* user side memory interface for support IO memory inside user mode linux
|
||||
*
|
||||
* Copyright (C) 2001 RidgeRun, Inc.
|
||||
* Author: RidgeRun, Inc.
|
||||
* Greg Lonnon glonnon@ridgerun.com or info@ridgerun.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _MEM_USER_H
|
||||
#define _MEM_USER_H
|
||||
|
||||
struct iomem_region {
|
||||
struct iomem_region *next;
|
||||
char *driver;
|
||||
int fd;
|
||||
int size;
|
||||
unsigned long phys;
|
||||
unsigned long virt;
|
||||
};
|
||||
|
||||
extern struct iomem_region *iomem_regions;
|
||||
extern int iomem_size;
|
||||
|
||||
#define ROUND_4M(n) ((((unsigned long) (n)) + (1 << 22)) & ~((1 << 22) - 1))
|
||||
|
||||
extern int init_mem_user(void);
|
||||
extern void setup_memory(void *entry);
|
||||
extern unsigned long find_iomem(char *driver, unsigned long *len_out);
|
||||
extern void mem_total_pages(unsigned long physmem, unsigned long iomem,
|
||||
unsigned long highmem);
|
||||
extern unsigned long get_vm(unsigned long len);
|
||||
extern void setup_physmem(unsigned long start, unsigned long usable,
|
||||
unsigned long len, unsigned long long highmem);
|
||||
extern void add_iomem(char *name, int fd, unsigned long size);
|
||||
extern unsigned long phys_offset(unsigned long phys);
|
||||
extern void map_memory(unsigned long virt, unsigned long phys,
|
||||
unsigned long len, int r, int w, int x);
|
||||
|
||||
#endif
|
||||
69
arch/um/include/shared/net_kern.h
Normal file
69
arch/um/include/shared/net_kern.h
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_NET_KERN_H
|
||||
#define __UM_NET_KERN_H
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct uml_net {
|
||||
struct list_head list;
|
||||
struct net_device *dev;
|
||||
struct platform_device pdev;
|
||||
int index;
|
||||
};
|
||||
|
||||
struct uml_net_private {
|
||||
struct list_head list;
|
||||
spinlock_t lock;
|
||||
struct net_device *dev;
|
||||
struct timer_list tl;
|
||||
|
||||
struct work_struct work;
|
||||
int fd;
|
||||
unsigned char mac[ETH_ALEN];
|
||||
int max_packet;
|
||||
unsigned short (*protocol)(struct sk_buff *);
|
||||
int (*open)(void *);
|
||||
void (*close)(int, void *);
|
||||
void (*remove)(void *);
|
||||
int (*read)(int, struct sk_buff *skb, struct uml_net_private *);
|
||||
int (*write)(int, struct sk_buff *skb, struct uml_net_private *);
|
||||
|
||||
void (*add_address)(unsigned char *, unsigned char *, void *);
|
||||
void (*delete_address)(unsigned char *, unsigned char *, void *);
|
||||
char user[0];
|
||||
};
|
||||
|
||||
struct net_kern_info {
|
||||
void (*init)(struct net_device *, void *);
|
||||
unsigned short (*protocol)(struct sk_buff *);
|
||||
int (*read)(int, struct sk_buff *skb, struct uml_net_private *);
|
||||
int (*write)(int, struct sk_buff *skb, struct uml_net_private *);
|
||||
};
|
||||
|
||||
struct transport {
|
||||
struct list_head list;
|
||||
const char *name;
|
||||
int (* const setup)(char *, char **, void *);
|
||||
const struct net_user_info *user;
|
||||
const struct net_kern_info *kern;
|
||||
const int private_size;
|
||||
const int setup_size;
|
||||
};
|
||||
|
||||
extern struct net_device *ether_init(int);
|
||||
extern unsigned short ether_protocol(struct sk_buff *);
|
||||
extern int tap_setup_common(char *str, char *type, char **dev_name,
|
||||
char **mac_out, char **gate_addr);
|
||||
extern void register_transport(struct transport *new);
|
||||
extern unsigned short eth_protocol(struct sk_buff *skb);
|
||||
|
||||
#endif
|
||||
53
arch/um/include/shared/net_user.h
Normal file
53
arch/um/include/shared/net_user.h
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_NET_USER_H__
|
||||
#define __UM_NET_USER_H__
|
||||
|
||||
#define ETH_ADDR_LEN (6)
|
||||
#define ETH_HEADER_ETHERTAP (16)
|
||||
#define ETH_HEADER_OTHER (26) /* 14 for ethernet + VLAN + MPLS for crazy people */
|
||||
#define ETH_MAX_PACKET (1500)
|
||||
|
||||
#define UML_NET_VERSION (4)
|
||||
|
||||
struct net_user_info {
|
||||
int (*init)(void *, void *);
|
||||
int (*open)(void *);
|
||||
void (*close)(int, void *);
|
||||
void (*remove)(void *);
|
||||
void (*add_address)(unsigned char *, unsigned char *, void *);
|
||||
void (*delete_address)(unsigned char *, unsigned char *, void *);
|
||||
int max_packet;
|
||||
int mtu;
|
||||
};
|
||||
|
||||
extern void ether_user_init(void *data, void *dev);
|
||||
extern void iter_addresses(void *d, void (*cb)(unsigned char *,
|
||||
unsigned char *, void *),
|
||||
void *arg);
|
||||
|
||||
extern void *get_output_buffer(int *len_out);
|
||||
extern void free_output_buffer(void *buffer);
|
||||
|
||||
extern int tap_open_common(void *dev, char *gate_addr);
|
||||
extern void tap_check_ips(char *gate_addr, unsigned char *eth_addr);
|
||||
|
||||
extern void read_output(int fd, char *output_out, int len);
|
||||
|
||||
extern int net_read(int fd, void *buf, int len);
|
||||
extern int net_recvfrom(int fd, void *buf, int len);
|
||||
extern int net_write(int fd, void *buf, int len);
|
||||
extern int net_send(int fd, void *buf, int len);
|
||||
extern int net_sendto(int fd, void *buf, int len, void *to, int sock_len);
|
||||
|
||||
extern void open_addr(unsigned char *addr, unsigned char *netmask, void *arg);
|
||||
extern void close_addr(unsigned char *addr, unsigned char *netmask, void *arg);
|
||||
|
||||
extern char *split_if_spec(char *str, ...);
|
||||
|
||||
extern int dev_netmask(void *d, void *m);
|
||||
|
||||
#endif
|
||||
306
arch/um/include/shared/os.h
Normal file
306
arch/um/include/shared/os.h
Normal file
|
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __OS_H__
|
||||
#define __OS_H__
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <irq_user.h>
|
||||
#include <longjmp.h>
|
||||
#include <mm_id.h>
|
||||
|
||||
#define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR))
|
||||
|
||||
#define OS_TYPE_FILE 1
|
||||
#define OS_TYPE_DIR 2
|
||||
#define OS_TYPE_SYMLINK 3
|
||||
#define OS_TYPE_CHARDEV 4
|
||||
#define OS_TYPE_BLOCKDEV 5
|
||||
#define OS_TYPE_FIFO 6
|
||||
#define OS_TYPE_SOCK 7
|
||||
|
||||
/* os_access() flags */
|
||||
#define OS_ACC_F_OK 0 /* Test for existence. */
|
||||
#define OS_ACC_X_OK 1 /* Test for execute permission. */
|
||||
#define OS_ACC_W_OK 2 /* Test for write permission. */
|
||||
#define OS_ACC_R_OK 4 /* Test for read permission. */
|
||||
#define OS_ACC_RW_OK (OS_ACC_W_OK | OS_ACC_R_OK) /* Test for RW permission */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define OS_LIB_PATH "/usr/lib64/"
|
||||
#else
|
||||
#define OS_LIB_PATH "/usr/lib/"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* types taken from stat_file() in hostfs_user.c
|
||||
* (if they are wrong here, they are wrong there...).
|
||||
*/
|
||||
struct uml_stat {
|
||||
int ust_dev; /* device */
|
||||
unsigned long long ust_ino; /* inode */
|
||||
int ust_mode; /* protection */
|
||||
int ust_nlink; /* number of hard links */
|
||||
int ust_uid; /* user ID of owner */
|
||||
int ust_gid; /* group ID of owner */
|
||||
unsigned long long ust_size; /* total size, in bytes */
|
||||
int ust_blksize; /* blocksize for filesystem I/O */
|
||||
unsigned long long ust_blocks; /* number of blocks allocated */
|
||||
unsigned long ust_atime; /* time of last access */
|
||||
unsigned long ust_mtime; /* time of last modification */
|
||||
unsigned long ust_ctime; /* time of last change */
|
||||
};
|
||||
|
||||
struct openflags {
|
||||
unsigned int r : 1;
|
||||
unsigned int w : 1;
|
||||
unsigned int s : 1; /* O_SYNC */
|
||||
unsigned int c : 1; /* O_CREAT */
|
||||
unsigned int t : 1; /* O_TRUNC */
|
||||
unsigned int a : 1; /* O_APPEND */
|
||||
unsigned int e : 1; /* O_EXCL */
|
||||
unsigned int cl : 1; /* FD_CLOEXEC */
|
||||
};
|
||||
|
||||
#define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \
|
||||
.t = 0, .a = 0, .e = 0, .cl = 0 })
|
||||
|
||||
static inline struct openflags of_read(struct openflags flags)
|
||||
{
|
||||
flags.r = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_write(struct openflags flags)
|
||||
{
|
||||
flags.w = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_rdwr(struct openflags flags)
|
||||
{
|
||||
return of_read(of_write(flags));
|
||||
}
|
||||
|
||||
static inline struct openflags of_set_rw(struct openflags flags, int r, int w)
|
||||
{
|
||||
flags.r = r;
|
||||
flags.w = w;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_sync(struct openflags flags)
|
||||
{
|
||||
flags.s = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_create(struct openflags flags)
|
||||
{
|
||||
flags.c = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_trunc(struct openflags flags)
|
||||
{
|
||||
flags.t = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_append(struct openflags flags)
|
||||
{
|
||||
flags.a = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_excl(struct openflags flags)
|
||||
{
|
||||
flags.e = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
static inline struct openflags of_cloexec(struct openflags flags)
|
||||
{
|
||||
flags.cl = 1;
|
||||
return flags;
|
||||
}
|
||||
|
||||
/* file.c */
|
||||
extern int os_stat_file(const char *file_name, struct uml_stat *buf);
|
||||
extern int os_stat_fd(const int fd, struct uml_stat *buf);
|
||||
extern int os_access(const char *file, int mode);
|
||||
extern int os_set_exec_close(int fd);
|
||||
extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg);
|
||||
extern int os_get_ifname(int fd, char *namebuf);
|
||||
extern int os_set_slip(int fd);
|
||||
extern int os_mode_fd(int fd, int mode);
|
||||
extern int os_fsync_file(int fd);
|
||||
|
||||
extern int os_seek_file(int fd, unsigned long long offset);
|
||||
extern int os_open_file(const char *file, struct openflags flags, int mode);
|
||||
extern int os_read_file(int fd, void *buf, int len);
|
||||
extern int os_write_file(int fd, const void *buf, int count);
|
||||
extern int os_sync_file(int fd);
|
||||
extern int os_file_size(const char *file, unsigned long long *size_out);
|
||||
extern int os_file_modtime(const char *file, unsigned long *modtime);
|
||||
extern int os_pipe(int *fd, int stream, int close_on_exec);
|
||||
extern int os_set_fd_async(int fd);
|
||||
extern int os_clear_fd_async(int fd);
|
||||
extern int os_set_fd_block(int fd, int blocking);
|
||||
extern int os_accept_connection(int fd);
|
||||
extern int os_create_unix_socket(const char *file, int len, int close_on_exec);
|
||||
extern int os_shutdown_socket(int fd, int r, int w);
|
||||
extern void os_close_file(int fd);
|
||||
extern int os_rcv_fd(int fd, int *helper_pid_out);
|
||||
extern int create_unix_socket(char *file, int len, int close_on_exec);
|
||||
extern int os_connect_socket(const char *name);
|
||||
extern int os_file_type(char *file);
|
||||
extern int os_file_mode(const char *file, struct openflags *mode_out);
|
||||
extern int os_lock_file(int fd, int excl);
|
||||
extern void os_flush_stdout(void);
|
||||
extern int os_stat_filesystem(char *path, long *bsize_out,
|
||||
long long *blocks_out, long long *bfree_out,
|
||||
long long *bavail_out, long long *files_out,
|
||||
long long *ffree_out, void *fsid_out,
|
||||
int fsid_size, long *namelen_out,
|
||||
long *spare_out);
|
||||
extern int os_change_dir(char *dir);
|
||||
extern int os_fchange_dir(int fd);
|
||||
extern unsigned os_major(unsigned long long dev);
|
||||
extern unsigned os_minor(unsigned long long dev);
|
||||
extern unsigned long long os_makedev(unsigned major, unsigned minor);
|
||||
|
||||
/* start_up.c */
|
||||
extern void os_early_checks(void);
|
||||
extern void can_do_skas(void);
|
||||
extern void os_check_bugs(void);
|
||||
extern void check_host_supports_tls(int *supports_tls, int *tls_min);
|
||||
|
||||
/* mem.c */
|
||||
extern int create_mem_file(unsigned long long len);
|
||||
|
||||
/* process.c */
|
||||
extern unsigned long os_process_pc(int pid);
|
||||
extern int os_process_parent(int pid);
|
||||
extern void os_stop_process(int pid);
|
||||
extern void os_kill_process(int pid, int reap_child);
|
||||
extern void os_kill_ptraced_process(int pid, int reap_child);
|
||||
extern long os_ptrace_ldt(long pid, long addr, long data);
|
||||
|
||||
extern int os_getpid(void);
|
||||
extern int os_getpgrp(void);
|
||||
|
||||
extern void init_new_thread_signals(void);
|
||||
|
||||
extern int os_map_memory(void *virt, int fd, unsigned long long off,
|
||||
unsigned long len, int r, int w, int x);
|
||||
extern int os_protect_memory(void *addr, unsigned long len,
|
||||
int r, int w, int x);
|
||||
extern int os_unmap_memory(void *addr, int len);
|
||||
extern int os_drop_memory(void *addr, int length);
|
||||
extern int can_drop_memory(void);
|
||||
extern void os_flush_stdout(void);
|
||||
extern int os_mincore(void *addr, unsigned long len);
|
||||
|
||||
/* execvp.c */
|
||||
extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
|
||||
/* helper.c */
|
||||
extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
|
||||
extern int run_helper_thread(int (*proc)(void *), void *arg,
|
||||
unsigned int flags, unsigned long *stack_out);
|
||||
extern int helper_wait(int pid);
|
||||
|
||||
|
||||
/* umid.c */
|
||||
extern int umid_file_name(char *name, char *buf, int len);
|
||||
extern int set_umid(char *name);
|
||||
extern char *get_umid(void);
|
||||
|
||||
/* signal.c */
|
||||
extern void timer_init(void);
|
||||
extern void set_sigstack(void *sig_stack, int size);
|
||||
extern void remove_sigstack(void);
|
||||
extern void set_handler(int sig);
|
||||
extern int change_sig(int signal, int on);
|
||||
extern void block_signals(void);
|
||||
extern void unblock_signals(void);
|
||||
extern int get_signals(void);
|
||||
extern int set_signals(int enable);
|
||||
extern int os_is_signal_stack(void);
|
||||
|
||||
/* util.c */
|
||||
extern void stack_protections(unsigned long address);
|
||||
extern int raw(int fd);
|
||||
extern void setup_machinename(char *machine_out);
|
||||
extern void setup_hostinfo(char *buf, int len);
|
||||
extern void os_dump_core(void) __attribute__ ((noreturn));
|
||||
extern void um_early_printk(const char *s, unsigned int n);
|
||||
extern void os_fix_helper_signals(void);
|
||||
|
||||
/* time.c */
|
||||
extern void idle_sleep(unsigned long long nsecs);
|
||||
extern int set_interval(void);
|
||||
extern int timer_one_shot(int ticks);
|
||||
extern long long disable_timer(void);
|
||||
extern void uml_idle_timer(void);
|
||||
extern long long os_nsecs(void);
|
||||
|
||||
/* skas/mem.c */
|
||||
extern long run_syscall_stub(struct mm_id * mm_idp,
|
||||
int syscall, unsigned long *args, long expected,
|
||||
void **addr, int done);
|
||||
extern long syscall_stub_data(struct mm_id * mm_idp,
|
||||
unsigned long *data, int data_count,
|
||||
void **addr, void **stub_addr);
|
||||
extern int map(struct mm_id * mm_idp, unsigned long virt,
|
||||
unsigned long len, int prot, int phys_fd,
|
||||
unsigned long long offset, int done, void **data);
|
||||
extern int unmap(struct mm_id * mm_idp, unsigned long addr, unsigned long len,
|
||||
int done, void **data);
|
||||
extern int protect(struct mm_id * mm_idp, unsigned long addr,
|
||||
unsigned long len, unsigned int prot, int done, void **data);
|
||||
|
||||
/* skas/process.c */
|
||||
extern int is_skas_winch(int pid, int fd, void *data);
|
||||
extern int start_userspace(unsigned long stub_stack);
|
||||
extern int copy_context_skas0(unsigned long stack, int pid);
|
||||
extern void userspace(struct uml_pt_regs *regs);
|
||||
extern int map_stub_pages(int fd, unsigned long code, unsigned long data,
|
||||
unsigned long stack);
|
||||
extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
|
||||
extern void switch_threads(jmp_buf *me, jmp_buf *you);
|
||||
extern int start_idle_thread(void *stack, jmp_buf *switch_buf);
|
||||
extern void initial_thread_cb_skas(void (*proc)(void *),
|
||||
void *arg);
|
||||
extern void halt_skas(void);
|
||||
extern void reboot_skas(void);
|
||||
|
||||
/* irq.c */
|
||||
extern int os_waiting_for_events(struct irq_fd *active_fds);
|
||||
extern int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds);
|
||||
extern void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg,
|
||||
struct irq_fd *active_fds, struct irq_fd ***last_irq_ptr2);
|
||||
extern void os_free_irq_later(struct irq_fd *active_fds,
|
||||
int irq, void *dev_id);
|
||||
extern int os_get_pollfd(int i);
|
||||
extern void os_set_pollfd(int i, int fd);
|
||||
extern void os_set_ioignore(void);
|
||||
|
||||
/* sigio.c */
|
||||
extern int add_sigio_fd(int fd);
|
||||
extern int ignore_sigio_fd(int fd);
|
||||
extern void maybe_sigio_broken(int fd, int read);
|
||||
extern void sigio_broken(int fd, int read);
|
||||
|
||||
/* sys-x86_64/prctl.c */
|
||||
extern int os_arch_prctl(int pid, int code, unsigned long *addr);
|
||||
|
||||
/* tty.c */
|
||||
extern int get_pty(void);
|
||||
|
||||
/* sys-$ARCH/task_size.c */
|
||||
extern unsigned long os_get_top_address(void);
|
||||
|
||||
#endif
|
||||
56
arch/um/include/shared/ptrace_user.h
Normal file
56
arch/um/include/shared/ptrace_user.h
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __PTRACE_USER_H__
|
||||
#define __PTRACE_USER_H__
|
||||
|
||||
#include <sys/ptrace.h>
|
||||
#include <sysdep/ptrace_user.h>
|
||||
|
||||
extern int ptrace_getregs(long pid, unsigned long *regs_out);
|
||||
extern int ptrace_setregs(long pid, unsigned long *regs_in);
|
||||
|
||||
/* syscall emulation path in ptrace */
|
||||
|
||||
#ifndef PTRACE_SYSEMU
|
||||
#define PTRACE_SYSEMU 31
|
||||
#endif
|
||||
#ifndef PTRACE_SYSEMU_SINGLESTEP
|
||||
#define PTRACE_SYSEMU_SINGLESTEP 32
|
||||
#endif
|
||||
|
||||
/* On architectures, that started to support PTRACE_O_TRACESYSGOOD
|
||||
* in linux 2.4, there are two different definitions of
|
||||
* PTRACE_SETOPTIONS: linux 2.4 uses 21 while linux 2.6 uses 0x4200.
|
||||
* For binary compatibility, 2.6 also supports the old "21", named
|
||||
* PTRACE_OLDSETOPTION. On these architectures, UML always must use
|
||||
* "21", to ensure the kernel runs on 2.4 and 2.6 host without
|
||||
* recompilation. So, we use PTRACE_OLDSETOPTIONS in UML.
|
||||
* We also want to be able to build the kernel on 2.4, which doesn't
|
||||
* have PTRACE_OLDSETOPTIONS. So, if it is missing, we declare
|
||||
* PTRACE_OLDSETOPTIONS to be the same as PTRACE_SETOPTIONS.
|
||||
*
|
||||
* On architectures, that start to support PTRACE_O_TRACESYSGOOD on
|
||||
* linux 2.6, PTRACE_OLDSETOPTIONS never is defined, and also isn't
|
||||
* supported by the host kernel. In that case, our trick lets us use
|
||||
* the new 0x4200 with the name PTRACE_OLDSETOPTIONS.
|
||||
*/
|
||||
#ifndef PTRACE_OLDSETOPTIONS
|
||||
#define PTRACE_OLDSETOPTIONS PTRACE_SETOPTIONS
|
||||
#endif
|
||||
|
||||
void set_using_sysemu(int value);
|
||||
int get_using_sysemu(void);
|
||||
extern int sysemu_supported;
|
||||
|
||||
#define SELECT_PTRACE_OPERATION(sysemu_mode, singlestep_mode) \
|
||||
(((int[3][3] ) { \
|
||||
{ PTRACE_SYSCALL, PTRACE_SYSCALL, PTRACE_SINGLESTEP }, \
|
||||
{ PTRACE_SYSEMU, PTRACE_SYSEMU, PTRACE_SINGLESTEP }, \
|
||||
{ PTRACE_SYSEMU, PTRACE_SYSEMU_SINGLESTEP, \
|
||||
PTRACE_SYSEMU_SINGLESTEP } }) \
|
||||
[sysemu_mode][singlestep_mode])
|
||||
|
||||
#endif
|
||||
24
arch/um/include/shared/registers.h
Normal file
24
arch/um/include/shared/registers.h
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright (C) 2004 PathScale, Inc
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __REGISTERS_H
|
||||
#define __REGISTERS_H
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
#include <sysdep/archsetjmp.h>
|
||||
|
||||
extern int save_fp_registers(int pid, unsigned long *fp_regs);
|
||||
extern int restore_fp_registers(int pid, unsigned long *fp_regs);
|
||||
extern int save_fpx_registers(int pid, unsigned long *fp_regs);
|
||||
extern int restore_fpx_registers(int pid, unsigned long *fp_regs);
|
||||
extern int save_registers(int pid, struct uml_pt_regs *regs);
|
||||
extern int restore_registers(int pid, struct uml_pt_regs *regs);
|
||||
extern int init_registers(int pid);
|
||||
extern void get_safe_registers(unsigned long *regs, unsigned long *fp_regs);
|
||||
extern unsigned long get_thread_reg(int reg, jmp_buf *buf);
|
||||
extern int get_fp_registers(int pid, unsigned long *regs);
|
||||
extern int put_fp_registers(int pid, unsigned long *regs);
|
||||
|
||||
#endif
|
||||
14
arch/um/include/shared/sigio.h
Normal file
14
arch/um/include/shared/sigio.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __SIGIO_H__
|
||||
#define __SIGIO_H__
|
||||
|
||||
extern int write_sigio_irq(int fd);
|
||||
extern int register_sigio_fd(int fd);
|
||||
extern void sigio_lock(void);
|
||||
extern void sigio_unlock(void);
|
||||
|
||||
#endif
|
||||
17
arch/um/include/shared/skas/mm_id.h
Normal file
17
arch/um/include/shared/skas/mm_id.h
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* Copyright (C) 2005 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __MM_ID_H
|
||||
#define __MM_ID_H
|
||||
|
||||
struct mm_id {
|
||||
union {
|
||||
int mm_fd;
|
||||
int pid;
|
||||
} u;
|
||||
unsigned long stack;
|
||||
};
|
||||
|
||||
#endif
|
||||
44
arch/um/include/shared/skas/proc_mm.h
Normal file
44
arch/um/include/shared/skas/proc_mm.h
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __SKAS_PROC_MM_H
|
||||
#define __SKAS_PROC_MM_H
|
||||
|
||||
#define MM_MMAP 54
|
||||
#define MM_MUNMAP 55
|
||||
#define MM_MPROTECT 56
|
||||
#define MM_COPY_SEGMENTS 57
|
||||
|
||||
struct mm_mmap {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
unsigned long prot;
|
||||
unsigned long flags;
|
||||
unsigned long fd;
|
||||
unsigned long offset;
|
||||
};
|
||||
|
||||
struct mm_munmap {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
};
|
||||
|
||||
struct mm_mprotect {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
unsigned int prot;
|
||||
};
|
||||
|
||||
struct proc_mm_op {
|
||||
int op;
|
||||
union {
|
||||
struct mm_mmap mmap;
|
||||
struct mm_munmap munmap;
|
||||
struct mm_mprotect mprotect;
|
||||
int copy_segments;
|
||||
} u;
|
||||
};
|
||||
|
||||
#endif
|
||||
22
arch/um/include/shared/skas/skas.h
Normal file
22
arch/um/include/shared/skas/skas.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __SKAS_H
|
||||
#define __SKAS_H
|
||||
|
||||
#include <sysdep/ptrace.h>
|
||||
|
||||
extern int userspace_pid[];
|
||||
extern int proc_mm, ptrace_faultinfo, ptrace_ldt;
|
||||
extern int skas_needs_stub;
|
||||
|
||||
extern int user_thread(unsigned long stack, int flags);
|
||||
extern void new_thread_handler(void);
|
||||
extern void handle_syscall(struct uml_pt_regs *regs);
|
||||
extern int new_mm(unsigned long stack);
|
||||
extern long execute_syscall_skas(void *r);
|
||||
extern unsigned long current_stub_stack(void);
|
||||
|
||||
#endif
|
||||
18
arch/um/include/shared/skas/stub-data.h
Normal file
18
arch/um/include/shared/skas/stub-data.h
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Copyright (C) 2005 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __STUB_DATA_H
|
||||
#define __STUB_DATA_H
|
||||
|
||||
#include <sys/time.h>
|
||||
|
||||
struct stub_data {
|
||||
long offset;
|
||||
int fd;
|
||||
struct itimerval timer;
|
||||
long err;
|
||||
};
|
||||
|
||||
#endif
|
||||
14
arch/um/include/shared/skas_ptrace.h
Normal file
14
arch/um/include/shared/skas_ptrace.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __SKAS_PTRACE_H
|
||||
#define __SKAS_PTRACE_H
|
||||
|
||||
#define PTRACE_FAULTINFO 52
|
||||
#define PTRACE_SWITCH_MM 55
|
||||
|
||||
#include <sysdep/skas_ptrace.h>
|
||||
|
||||
#endif
|
||||
19
arch/um/include/shared/um_malloc.h
Normal file
19
arch/um/include/shared/um_malloc.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_MALLOC_H__
|
||||
#define __UM_MALLOC_H__
|
||||
|
||||
#include <generated/asm-offsets.h>
|
||||
|
||||
extern void *uml_kmalloc(int size, int flags);
|
||||
extern void kfree(const void *ptr);
|
||||
|
||||
extern void *vmalloc(unsigned long size);
|
||||
extern void vfree(void *ptr);
|
||||
|
||||
#endif /* __UM_MALLOC_H__ */
|
||||
|
||||
|
||||
57
arch/um/include/shared/user.h
Normal file
57
arch/um/include/shared/user.h
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __USER_H__
|
||||
#define __USER_H__
|
||||
|
||||
#include <generated/asm-offsets.h>
|
||||
|
||||
/*
|
||||
* The usual definition - copied here because the kernel provides its own,
|
||||
* fancier, type-safe, definition. Using that one would require
|
||||
* copying too much infrastructure for my taste, so userspace files
|
||||
* get less checking than kernel files.
|
||||
*/
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
/* This is to get size_t */
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
#else
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
extern void panic(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
/* Requires preincluding include/linux/kern_levels.h */
|
||||
#define UM_KERN_EMERG KERN_EMERG
|
||||
#define UM_KERN_ALERT KERN_ALERT
|
||||
#define UM_KERN_CRIT KERN_CRIT
|
||||
#define UM_KERN_ERR KERN_ERR
|
||||
#define UM_KERN_WARNING KERN_WARNING
|
||||
#define UM_KERN_NOTICE KERN_NOTICE
|
||||
#define UM_KERN_INFO KERN_INFO
|
||||
#define UM_KERN_DEBUG KERN_DEBUG
|
||||
#define UM_KERN_CONT KERN_CONT
|
||||
|
||||
#ifdef UML_CONFIG_PRINTK
|
||||
extern int printk(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
#else
|
||||
static inline int printk(const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int in_aton(char *str);
|
||||
extern size_t strlcpy(char *, const char *, size_t);
|
||||
extern size_t strlcat(char *, const char *, size_t);
|
||||
|
||||
/* Copied from linux/compiler-gcc.h since we can't include it directly */
|
||||
#define barrier() __asm__ __volatile__("": : :"memory")
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue