Merge commit 'v2.6.28-rc2' into core/locking
Conflicts: arch/um/include/asm/system.h
This commit is contained in:
27
arch/um/include/asm/a.out-core.h
Normal file
27
arch/um/include/asm/a.out-core.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/* a.out coredump register dumper
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __UM_A_OUT_CORE_H
|
||||
#define __UM_A_OUT_CORE_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/user.h>
|
||||
|
||||
/*
|
||||
* fill in the user structure for an a.out core dump
|
||||
*/
|
||||
static inline void aout_dump_thread(struct pt_regs *regs, struct user *u)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __UM_A_OUT_CORE_H */
|
4
arch/um/include/asm/apic.h
Normal file
4
arch/um/include/asm/apic.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#ifndef __UM_APIC_H
|
||||
#define __UM_APIC_H
|
||||
|
||||
#endif
|
4
arch/um/include/asm/auxvec.h
Normal file
4
arch/um/include/asm/auxvec.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#ifndef __UM_AUXVEC_H
|
||||
#define __UM_AUXVEC_H
|
||||
|
||||
#endif
|
6
arch/um/include/asm/bugs.h
Normal file
6
arch/um/include/asm/bugs.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef __UM_BUGS_H
|
||||
#define __UM_BUGS_H
|
||||
|
||||
void check_bugs(void);
|
||||
|
||||
#endif
|
17
arch/um/include/asm/cache.h
Normal file
17
arch/um/include/asm/cache.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef __UM_CACHE_H
|
||||
#define __UM_CACHE_H
|
||||
|
||||
|
||||
#if defined(CONFIG_UML_X86) && !defined(CONFIG_64BIT)
|
||||
# define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
|
||||
#elif defined(CONFIG_UML_X86) /* 64-bit */
|
||||
# define L1_CACHE_SHIFT 6 /* Should be 7 on Intel */
|
||||
#else
|
||||
/* XXX: this was taken from x86, now it's completely random. Luckily only
|
||||
* affects SMP padding. */
|
||||
# define L1_CACHE_SHIFT 5
|
||||
#endif
|
||||
|
||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||
|
||||
#endif
|
6
arch/um/include/asm/checksum.h
Normal file
6
arch/um/include/asm/checksum.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef __UM_CHECKSUM_H
|
||||
#define __UM_CHECKSUM_H
|
||||
|
||||
#include "sysdep/checksum.h"
|
||||
|
||||
#endif
|
130
arch/um/include/asm/common.lds.S
Normal file
130
arch/um/include/asm/common.lds.S
Normal file
@@ -0,0 +1,130 @@
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
|
||||
.fini : { *(.fini) } =0x9090
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
|
||||
. = ALIGN(4096);
|
||||
_sdata = .;
|
||||
PROVIDE (sdata = .);
|
||||
|
||||
RODATA
|
||||
|
||||
.unprotected : { *(.unprotected) }
|
||||
. = ALIGN(4096);
|
||||
PROVIDE (_unprotected_end = .);
|
||||
|
||||
. = ALIGN(4096);
|
||||
.note : { *(.note.*) }
|
||||
__ex_table : {
|
||||
__start___ex_table = .;
|
||||
*(__ex_table)
|
||||
__stop___ex_table = .;
|
||||
}
|
||||
|
||||
BUG_TABLE
|
||||
|
||||
.uml.setup.init : {
|
||||
__uml_setup_start = .;
|
||||
*(.uml.setup.init)
|
||||
__uml_setup_end = .;
|
||||
}
|
||||
|
||||
.uml.help.init : {
|
||||
__uml_help_start = .;
|
||||
*(.uml.help.init)
|
||||
__uml_help_end = .;
|
||||
}
|
||||
|
||||
.uml.postsetup.init : {
|
||||
__uml_postsetup_start = .;
|
||||
*(.uml.postsetup.init)
|
||||
__uml_postsetup_end = .;
|
||||
}
|
||||
|
||||
.init.setup : {
|
||||
__setup_start = .;
|
||||
*(.init.setup)
|
||||
__setup_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(32);
|
||||
.data.percpu : {
|
||||
__per_cpu_start = . ;
|
||||
*(.data.percpu)
|
||||
__per_cpu_end = . ;
|
||||
}
|
||||
|
||||
.initcall.init : {
|
||||
__initcall_start = .;
|
||||
INITCALLS
|
||||
__initcall_end = .;
|
||||
}
|
||||
|
||||
.con_initcall.init : {
|
||||
__con_initcall_start = .;
|
||||
*(.con_initcall.init)
|
||||
__con_initcall_end = .;
|
||||
}
|
||||
|
||||
.uml.initcall.init : {
|
||||
__uml_initcall_start = .;
|
||||
*(.uml.initcall.init)
|
||||
__uml_initcall_end = .;
|
||||
}
|
||||
__init_end = .;
|
||||
|
||||
SECURITY_INIT
|
||||
|
||||
.exitcall : {
|
||||
__exitcall_begin = .;
|
||||
*(.exitcall.exit)
|
||||
__exitcall_end = .;
|
||||
}
|
||||
|
||||
.uml.exitcall : {
|
||||
__uml_exitcall_begin = .;
|
||||
*(.uml.exitcall.exit)
|
||||
__uml_exitcall_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.altinstructions : {
|
||||
__alt_instructions = .;
|
||||
*(.altinstructions)
|
||||
__alt_instructions_end = .;
|
||||
}
|
||||
.altinstr_replacement : { *(.altinstr_replacement) }
|
||||
/* .exit.text is discard at runtime, not link time, to deal with references
|
||||
from .altinstructions and .eh_frame */
|
||||
.exit.text : { *(.exit.text) }
|
||||
.exit.data : { *(.exit.data) }
|
||||
|
||||
.preinit_array : {
|
||||
__preinit_array_start = .;
|
||||
*(.preinit_array)
|
||||
__preinit_array_end = .;
|
||||
}
|
||||
.init_array : {
|
||||
__init_array_start = .;
|
||||
*(.init_array)
|
||||
__init_array_end = .;
|
||||
}
|
||||
.fini_array : {
|
||||
__fini_array_start = .;
|
||||
*(.fini_array)
|
||||
__fini_array_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
.init.ramfs : {
|
||||
__initramfs_start = .;
|
||||
*(.init.ramfs)
|
||||
__initramfs_end = .;
|
||||
}
|
||||
|
||||
/* Sections to be discarded */
|
||||
/DISCARD/ : {
|
||||
*(.exitcall.exit)
|
||||
}
|
||||
|
6
arch/um/include/asm/cputime.h
Normal file
6
arch/um/include/asm/cputime.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef __UM_CPUTIME_H
|
||||
#define __UM_CPUTIME_H
|
||||
|
||||
#include <asm-generic/cputime.h>
|
||||
|
||||
#endif /* __UM_CPUTIME_H */
|
13
arch/um/include/asm/current.h
Normal file
13
arch/um/include/asm/current.h
Normal file
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_CURRENT_H
|
||||
#define __UM_CURRENT_H
|
||||
|
||||
#include "linux/thread_info.h"
|
||||
|
||||
#define current (current_thread_info()->task)
|
||||
|
||||
#endif
|
20
arch/um/include/asm/delay.h
Normal file
20
arch/um/include/asm/delay.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef __UM_DELAY_H
|
||||
#define __UM_DELAY_H
|
||||
|
||||
#define MILLION 1000000
|
||||
|
||||
/* Undefined on purpose */
|
||||
extern void __bad_udelay(void);
|
||||
|
||||
extern void __udelay(unsigned long usecs);
|
||||
extern void __delay(unsigned long loops);
|
||||
|
||||
#define udelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
|
||||
__bad_udelay() : __udelay(n))
|
||||
|
||||
/* It appears that ndelay is not used at all for UML, and has never been
|
||||
* implemented. */
|
||||
extern void __unimplemented_ndelay(void);
|
||||
#define ndelay(n) __unimplemented_ndelay()
|
||||
|
||||
#endif
|
16
arch/um/include/asm/desc.h
Normal file
16
arch/um/include/asm/desc.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef __UM_DESC_H
|
||||
#define __UM_DESC_H
|
||||
|
||||
/* Taken from asm-i386/desc.h, it's the only thing we need. The rest wouldn't
|
||||
* compile, and has never been used. */
|
||||
#define LDT_empty(info) (\
|
||||
(info)->base_addr == 0 && \
|
||||
(info)->limit == 0 && \
|
||||
(info)->contents == 0 && \
|
||||
(info)->read_exec_only == 1 && \
|
||||
(info)->seg_32bit == 0 && \
|
||||
(info)->limit_in_pages == 0 && \
|
||||
(info)->seg_not_present == 1 && \
|
||||
(info)->useable == 0 )
|
||||
|
||||
#endif
|
7
arch/um/include/asm/device.h
Normal file
7
arch/um/include/asm/device.h
Normal file
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
* Arch specific extensions to struct device
|
||||
*
|
||||
* This file is released under the GPLv2
|
||||
*/
|
||||
#include <asm-generic/device.h>
|
||||
|
128
arch/um/include/asm/dma-mapping.h
Normal file
128
arch/um/include/asm/dma-mapping.h
Normal file
@@ -0,0 +1,128 @@
|
||||
#ifndef _ASM_DMA_MAPPING_H
|
||||
#define _ASM_DMA_MAPPING_H
|
||||
|
||||
#include <asm/scatterlist.h>
|
||||
|
||||
static inline int
|
||||
dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_set_mask(struct device *dev, u64 dma_mask)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline void *
|
||||
dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||
gfp_t flag)
|
||||
{
|
||||
BUG();
|
||||
return((void *) 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
|
||||
dma_addr_t dma_handle)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline dma_addr_t
|
||||
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline dma_addr_t
|
||||
dma_map_page(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_single(struct device *dev, dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
|
||||
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
|
||||
#define dma_is_consistent(d, h) (1)
|
||||
|
||||
static inline int
|
||||
dma_get_cache_alignment(void)
|
||||
{
|
||||
BUG();
|
||||
return(0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int
|
||||
dma_mapping_error(struct device *dev, dma_addr_t dma_handle)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
10
arch/um/include/asm/dma.h
Normal file
10
arch/um/include/asm/dma.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef __UM_DMA_H
|
||||
#define __UM_DMA_H
|
||||
|
||||
#include "asm/io.h"
|
||||
|
||||
extern unsigned long uml_physmem;
|
||||
|
||||
#define MAX_DMA_ADDRESS (uml_physmem)
|
||||
|
||||
#endif
|
6
arch/um/include/asm/emergency-restart.h
Normal file
6
arch/um/include/asm/emergency-restart.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_EMERGENCY_RESTART_H
|
||||
#define _ASM_EMERGENCY_RESTART_H
|
||||
|
||||
#include <asm-generic/emergency-restart.h>
|
||||
|
||||
#endif /* _ASM_EMERGENCY_RESTART_H */
|
99
arch/um/include/asm/fixmap.h
Normal file
99
arch/um/include/asm/fixmap.h
Normal file
@@ -0,0 +1,99 @@
|
||||
#ifndef __UM_FIXMAP_H
|
||||
#define __UM_FIXMAP_H
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/kmap_types.h>
|
||||
#include <asm/archparam.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
/*
|
||||
* Here we define all the compile-time 'special' virtual
|
||||
* addresses. The point is to have a constant address at
|
||||
* compile time, but to set the physical address only
|
||||
* in the boot process. We allocate these special addresses
|
||||
* from the end of virtual memory (0xfffff000) backwards.
|
||||
* Also this lets us do fail-safe vmalloc(), we
|
||||
* can guarantee that these special addresses and
|
||||
* vmalloc()-ed addresses never overlap.
|
||||
*
|
||||
* these 'compile-time allocated' memory buffers are
|
||||
* fixed-size 4k pages. (or larger if used with an increment
|
||||
* highger than 1) use fixmap_set(idx,phys) to associate
|
||||
* physical memory with fixmap indices.
|
||||
*
|
||||
* TLB entries of such buffers will not be flushed across
|
||||
* task switches.
|
||||
*/
|
||||
|
||||
/*
|
||||
* on UP currently we will have no trace of the fixmap mechanizm,
|
||||
* no page table allocations, etc. This might change in the
|
||||
* future, say framebuffers for the console driver(s) could be
|
||||
* fix-mapped?
|
||||
*/
|
||||
enum fixed_addresses {
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
|
||||
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
|
||||
#endif
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap (enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
/*
|
||||
* used by vmalloc.c.
|
||||
*
|
||||
* Leave one empty page between vmalloc'ed areas and
|
||||
* the start of the fixmap, and leave one page empty
|
||||
* at the top of mem..
|
||||
*/
|
||||
|
||||
#define FIXADDR_TOP (TASK_SIZE - 2 * PAGE_SIZE)
|
||||
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
|
||||
|
||||
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
||||
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
|
||||
|
||||
extern void __this_fixmap_does_not_exist(void);
|
||||
|
||||
/*
|
||||
* 'index to address' translation. If anyone tries to use the idx
|
||||
* directly without tranlation, we catch the bug with a NULL-deference
|
||||
* kernel oops. Illegal ranges of incoming indices are caught too.
|
||||
*/
|
||||
static inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
{
|
||||
/*
|
||||
* this branch gets completely eliminated after inlining,
|
||||
* except when someone tries to use fixaddr indices in an
|
||||
* illegal way. (such as mixing up address types or using
|
||||
* out-of-range indices).
|
||||
*
|
||||
* If it doesn't get removed, the linker will complain
|
||||
* loudly with a reasonably clear error message..
|
||||
*/
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
||||
{
|
||||
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
|
||||
return __virt_to_fix(vaddr);
|
||||
}
|
||||
|
||||
#endif
|
6
arch/um/include/asm/futex.h
Normal file
6
arch/um/include/asm/futex.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_FUTEX_H
|
||||
#define _ASM_FUTEX_H
|
||||
|
||||
#include <asm-generic/futex.h>
|
||||
|
||||
#endif
|
25
arch/um/include/asm/hardirq.h
Normal file
25
arch/um/include/asm/hardirq.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/* (c) 2004 cw@f00f.org, GPLv2 blah blah */
|
||||
|
||||
#ifndef __ASM_UM_HARDIRQ_H
|
||||
#define __ASM_UM_HARDIRQ_H
|
||||
|
||||
#include <linux/threads.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
/* NOTE: When SMP works again we might want to make this
|
||||
* ____cacheline_aligned or maybe use per_cpu state? --cw */
|
||||
typedef struct {
|
||||
unsigned int __softirq_pending;
|
||||
} irq_cpustat_t;
|
||||
|
||||
#include <linux/irq_cpustat.h>
|
||||
|
||||
/* As this would be very strange for UML to get we BUG() after the
|
||||
* printk. */
|
||||
static inline void ack_bad_irq(unsigned int irq)
|
||||
{
|
||||
printk(KERN_ERR "unexpected IRQ %02x\n", irq);
|
||||
BUG();
|
||||
}
|
||||
|
||||
#endif /* __ASM_UM_HARDIRQ_H */
|
7
arch/um/include/asm/hw_irq.h
Normal file
7
arch/um/include/asm/hw_irq.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef _ASM_UM_HW_IRQ_H
|
||||
#define _ASM_UM_HW_IRQ_H
|
||||
|
||||
#include "asm/irq.h"
|
||||
#include "asm/archparam.h"
|
||||
|
||||
#endif
|
57
arch/um/include/asm/io.h
Normal file
57
arch/um/include/asm/io.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#ifndef __UM_IO_H
|
||||
#define __UM_IO_H
|
||||
|
||||
#include "asm/page.h"
|
||||
|
||||
#define IO_SPACE_LIMIT 0xdeadbeef /* Sure hope nothing uses this */
|
||||
|
||||
static inline int inb(unsigned long i) { return(0); }
|
||||
static inline void outb(char c, unsigned long i) { }
|
||||
|
||||
/*
|
||||
* Change virtual addresses to physical addresses and vv.
|
||||
* These are pretty trivial
|
||||
*/
|
||||
static inline unsigned long virt_to_phys(volatile void * address)
|
||||
{
|
||||
return __pa((void *) address);
|
||||
}
|
||||
|
||||
static inline void * phys_to_virt(unsigned long address)
|
||||
{
|
||||
return __va(address);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a physical pointer to a virtual kernel pointer for /dev/mem
|
||||
* access
|
||||
*/
|
||||
#define xlate_dev_mem_ptr(p) __va(p)
|
||||
|
||||
/*
|
||||
* Convert a virtual cached pointer to an uncached pointer
|
||||
*/
|
||||
#define xlate_dev_kmem_ptr(p) p
|
||||
|
||||
static inline void writeb(unsigned char b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned char __force *) addr = b;
|
||||
}
|
||||
static inline void writew(unsigned short b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned short __force *) addr = b;
|
||||
}
|
||||
static inline void writel(unsigned int b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned int __force *) addr = b;
|
||||
}
|
||||
static inline void writeq(unsigned int b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned long long __force *) addr = b;
|
||||
}
|
||||
#define __raw_writeb writeb
|
||||
#define __raw_writew writew
|
||||
#define __raw_writel writel
|
||||
#define __raw_writeq writeq
|
||||
|
||||
#endif
|
23
arch/um/include/asm/irq.h
Normal file
23
arch/um/include/asm/irq.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef __UM_IRQ_H
|
||||
#define __UM_IRQ_H
|
||||
|
||||
#define TIMER_IRQ 0
|
||||
#define UMN_IRQ 1
|
||||
#define CONSOLE_IRQ 2
|
||||
#define CONSOLE_WRITE_IRQ 3
|
||||
#define UBD_IRQ 4
|
||||
#define UM_ETH_IRQ 5
|
||||
#define SSL_IRQ 6
|
||||
#define SSL_WRITE_IRQ 7
|
||||
#define ACCEPT_IRQ 8
|
||||
#define MCONSOLE_IRQ 9
|
||||
#define WINCH_IRQ 10
|
||||
#define SIGIO_WRITE_IRQ 11
|
||||
#define TELNETD_IRQ 12
|
||||
#define XTERM_IRQ 13
|
||||
#define RANDOM_IRQ 14
|
||||
|
||||
#define LAST_IRQ RANDOM_IRQ
|
||||
#define NR_IRQS (LAST_IRQ + 1)
|
||||
|
||||
#endif
|
1
arch/um/include/asm/irq_regs.h
Normal file
1
arch/um/include/asm/irq_regs.h
Normal file
@@ -0,0 +1 @@
|
||||
#include <asm-generic/irq_regs.h>
|
20
arch/um/include/asm/irq_vectors.h
Normal file
20
arch/um/include/asm/irq_vectors.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_IRQ_VECTORS_H
|
||||
#define __UM_IRQ_VECTORS_H
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
6
arch/um/include/asm/irqflags.h
Normal file
6
arch/um/include/asm/irqflags.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef __UM_IRQFLAGS_H
|
||||
#define __UM_IRQFLAGS_H
|
||||
|
||||
/* Empty for now */
|
||||
|
||||
#endif
|
1
arch/um/include/asm/kdebug.h
Normal file
1
arch/um/include/asm/kdebug.h
Normal file
@@ -0,0 +1 @@
|
||||
#include <asm-generic/kdebug.h>
|
29
arch/um/include/asm/kmap_types.h
Normal file
29
arch/um/include/asm/kmap_types.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_KMAP_TYPES_H
|
||||
#define __UM_KMAP_TYPES_H
|
||||
|
||||
/* No more #include "asm/arch/kmap_types.h" ! */
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_UML_USERCOPY, /* UML specific, for copy_*_user - used in do_op_one_page */
|
||||
KM_BIO_SRC_IRQ,
|
||||
KM_BIO_DST_IRQ,
|
||||
KM_PTE0,
|
||||
KM_PTE1,
|
||||
KM_IRQ0,
|
||||
KM_IRQ1,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
|
||||
#endif
|
22
arch/um/include/asm/mmu.h
Normal file
22
arch/um/include/asm/mmu.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __MMU_H
|
||||
#define __MMU_H
|
||||
|
||||
#include "um_mmu.h"
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
54
arch/um/include/asm/mmu_context.h
Normal file
54
arch/um/include/asm/mmu_context.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_MMU_CONTEXT_H
|
||||
#define __UM_MMU_CONTEXT_H
|
||||
|
||||
#include "linux/sched.h"
|
||||
#include "um_mmu.h"
|
||||
|
||||
extern void arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm);
|
||||
extern void arch_exit_mmap(struct mm_struct *mm);
|
||||
|
||||
#define get_mmu_context(task) do ; while(0)
|
||||
#define activate_context(tsk) do ; while(0)
|
||||
|
||||
#define deactivate_mm(tsk,mm) do { } while (0)
|
||||
|
||||
extern void force_flush_all(void);
|
||||
|
||||
static inline void activate_mm(struct mm_struct *old, struct mm_struct *new)
|
||||
{
|
||||
/*
|
||||
* This is called by fs/exec.c and sys_unshare()
|
||||
* when the new ->mm is used for the first time.
|
||||
*/
|
||||
__switch_mm(&new->context.id);
|
||||
arch_dup_mmap(old, new);
|
||||
}
|
||||
|
||||
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
unsigned cpu = smp_processor_id();
|
||||
|
||||
if(prev != next){
|
||||
cpu_clear(cpu, prev->cpu_vm_mask);
|
||||
cpu_set(cpu, next->cpu_vm_mask);
|
||||
if(next != &init_mm)
|
||||
__switch_mm(&next->context.id);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
}
|
||||
|
||||
extern int init_new_context(struct task_struct *task, struct mm_struct *mm);
|
||||
|
||||
extern void destroy_context(struct mm_struct *mm);
|
||||
|
||||
#endif
|
9
arch/um/include/asm/mutex.h
Normal file
9
arch/um/include/asm/mutex.h
Normal file
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Pull in the generic implementation for the mutex fastpath.
|
||||
*
|
||||
* TODO: implement optimized primitives instead, or leave the generic
|
||||
* implementation in place, or pick the atomic_xchg() based generic
|
||||
* implementation. (see asm-generic/mutex-xchg.h for details)
|
||||
*/
|
||||
|
||||
#include <asm-generic/mutex-dec.h>
|
122
arch/um/include/asm/page.h
Normal file
122
arch/um/include/asm/page.h
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PAGE_H
|
||||
#define __UM_PAGE_H
|
||||
|
||||
#include <linux/const.h>
|
||||
|
||||
/* PAGE_SHIFT determines the page size */
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct page;
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <sysdep/vm-flags.h>
|
||||
|
||||
/*
|
||||
* These are used to make use of C type-checking..
|
||||
*/
|
||||
|
||||
#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
|
||||
#define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE)
|
||||
|
||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||
|
||||
#if defined(CONFIG_3_LEVEL_PGTABLES) && !defined(CONFIG_64BIT)
|
||||
|
||||
typedef struct { unsigned long pte_low, pte_high; } pte_t;
|
||||
typedef struct { unsigned long pmd; } pmd_t;
|
||||
typedef struct { unsigned long pgd; } pgd_t;
|
||||
#define pte_val(x) ((x).pte_low | ((unsigned long long) (x).pte_high << 32))
|
||||
|
||||
#define pte_get_bits(pte, bits) ((pte).pte_low & (bits))
|
||||
#define pte_set_bits(pte, bits) ((pte).pte_low |= (bits))
|
||||
#define pte_clear_bits(pte, bits) ((pte).pte_low &= ~(bits))
|
||||
#define pte_copy(to, from) ({ (to).pte_high = (from).pte_high; \
|
||||
smp_wmb(); \
|
||||
(to).pte_low = (from).pte_low; })
|
||||
#define pte_is_zero(pte) (!((pte).pte_low & ~_PAGE_NEWPAGE) && !(pte).pte_high)
|
||||
#define pte_set_val(pte, phys, prot) \
|
||||
({ (pte).pte_high = (phys) >> 32; \
|
||||
(pte).pte_low = (phys) | pgprot_val(prot); })
|
||||
|
||||
#define pmd_val(x) ((x).pmd)
|
||||
#define __pmd(x) ((pmd_t) { (x) } )
|
||||
|
||||
typedef unsigned long long pfn_t;
|
||||
typedef unsigned long long phys_t;
|
||||
|
||||
#else
|
||||
|
||||
typedef struct { unsigned long pte; } pte_t;
|
||||
typedef struct { unsigned long pgd; } pgd_t;
|
||||
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
typedef struct { unsigned long pmd; } pmd_t;
|
||||
#define pmd_val(x) ((x).pmd)
|
||||
#define __pmd(x) ((pmd_t) { (x) } )
|
||||
#endif
|
||||
|
||||
#define pte_val(x) ((x).pte)
|
||||
|
||||
|
||||
#define pte_get_bits(p, bits) ((p).pte & (bits))
|
||||
#define pte_set_bits(p, bits) ((p).pte |= (bits))
|
||||
#define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
|
||||
#define pte_copy(to, from) ((to).pte = (from).pte)
|
||||
#define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
|
||||
#define pte_set_val(p, phys, prot) (p).pte = (phys | pgprot_val(prot))
|
||||
|
||||
typedef unsigned long pfn_t;
|
||||
typedef unsigned long phys_t;
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct { unsigned long pgprot; } pgprot_t;
|
||||
|
||||
typedef struct page *pgtable_t;
|
||||
|
||||
#define pgd_val(x) ((x).pgd)
|
||||
#define pgprot_val(x) ((x).pgprot)
|
||||
|
||||
#define __pte(x) ((pte_t) { (x) } )
|
||||
#define __pgd(x) ((pgd_t) { (x) } )
|
||||
#define __pgprot(x) ((pgprot_t) { (x) } )
|
||||
|
||||
extern unsigned long uml_physmem;
|
||||
|
||||
#define PAGE_OFFSET (uml_physmem)
|
||||
#define KERNELBASE PAGE_OFFSET
|
||||
|
||||
#define __va_space (8*1024*1024)
|
||||
|
||||
#include "mem.h"
|
||||
|
||||
/* Cast to unsigned long before casting to void * to avoid a warning from
|
||||
* mmap_kmem about cutting a long long down to a void *. Not sure that
|
||||
* casting is the right thing, but 32-bit UML can't have 64-bit virtual
|
||||
* addresses
|
||||
*/
|
||||
#define __pa(virt) to_phys((void *) (unsigned long) (virt))
|
||||
#define __va(phys) to_virt((unsigned long) (phys))
|
||||
|
||||
#define phys_to_pfn(p) ((pfn_t) ((p) >> PAGE_SHIFT))
|
||||
#define pfn_to_phys(pfn) ((phys_t) ((pfn) << PAGE_SHIFT))
|
||||
|
||||
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
||||
#define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
|
||||
|
||||
#include <asm-generic/memory_model.h>
|
||||
#include <asm-generic/page.h>
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __UM_PAGE_H */
|
1
arch/um/include/asm/page_offset.h
Normal file
1
arch/um/include/asm/page_offset.h
Normal file
@@ -0,0 +1 @@
|
||||
#define PAGE_OFFSET_RAW (uml_physmem)
|
20
arch/um/include/asm/param.h
Normal file
20
arch/um/include/asm/param.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef _UM_PARAM_H
|
||||
#define _UM_PARAM_H
|
||||
|
||||
#define EXEC_PAGESIZE 4096
|
||||
|
||||
#ifndef NOGROUP
|
||||
#define NOGROUP (-1)
|
||||
#endif
|
||||
|
||||
#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define HZ CONFIG_HZ
|
||||
#define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
||||
#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */
|
||||
#else
|
||||
#define HZ 100
|
||||
#endif
|
||||
|
||||
#endif
|
7
arch/um/include/asm/pci.h
Normal file
7
arch/um/include/asm/pci.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef __UM_PCI_H
|
||||
#define __UM_PCI_H
|
||||
|
||||
#define PCI_DMA_BUS_IS_PHYS (1)
|
||||
#define pcibios_scan_all_fns(a, b) 0
|
||||
|
||||
#endif
|
31
arch/um/include/asm/pda.h
Normal file
31
arch/um/include/asm/pda.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
*
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PDA_X86_64_H
|
||||
#define __UM_PDA_X86_64_H
|
||||
|
||||
/* XXX */
|
||||
struct foo {
|
||||
unsigned int __softirq_pending;
|
||||
unsigned int __nmi_count;
|
||||
};
|
||||
|
||||
extern struct foo me;
|
||||
|
||||
#define read_pda(me) (&me)
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
72
arch/um/include/asm/pgalloc.h
Normal file
72
arch/um/include/asm/pgalloc.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
* Derived from include/asm-i386/pgalloc.h and include/asm-i386/pgtable.h
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PGALLOC_H
|
||||
#define __UM_PGALLOC_H
|
||||
|
||||
#include "linux/mm.h"
|
||||
#include "asm/fixmap.h"
|
||||
|
||||
#define pmd_populate_kernel(mm, pmd, pte) \
|
||||
set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte)))
|
||||
|
||||
#define pmd_populate(mm, pmd, pte) \
|
||||
set_pmd(pmd, __pmd(_PAGE_TABLE + \
|
||||
((unsigned long long)page_to_pfn(pte) << \
|
||||
(unsigned long long) PAGE_SHIFT)))
|
||||
#define pmd_pgtable(pmd) pmd_page(pmd)
|
||||
|
||||
/*
|
||||
* Allocate and free page tables.
|
||||
*/
|
||||
extern pgd_t *pgd_alloc(struct mm_struct *);
|
||||
extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
|
||||
|
||||
extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
|
||||
extern pgtable_t pte_alloc_one(struct mm_struct *, unsigned long);
|
||||
|
||||
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
|
||||
{
|
||||
free_page((unsigned long) pte);
|
||||
}
|
||||
|
||||
static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
||||
{
|
||||
pgtable_page_dtor(pte);
|
||||
__free_page(pte);
|
||||
}
|
||||
|
||||
#define __pte_free_tlb(tlb,pte) \
|
||||
do { \
|
||||
pgtable_page_dtor(pte); \
|
||||
tlb_remove_page((tlb),(pte)); \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
|
||||
static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||
{
|
||||
free_page((unsigned long)pmd);
|
||||
}
|
||||
|
||||
#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x))
|
||||
#endif
|
||||
|
||||
#define check_pgt_cache() do { } while (0)
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
53
arch/um/include/asm/pgtable-2level.h
Normal file
53
arch/um/include/asm/pgtable-2level.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
* Derived from include/asm-i386/pgtable.h
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PGTABLE_2LEVEL_H
|
||||
#define __UM_PGTABLE_2LEVEL_H
|
||||
|
||||
#include <asm-generic/pgtable-nopmd.h>
|
||||
|
||||
/* PGDIR_SHIFT determines what a third-level page table entry can map */
|
||||
|
||||
#define PGDIR_SHIFT 22
|
||||
#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
|
||||
#define PGDIR_MASK (~(PGDIR_SIZE-1))
|
||||
|
||||
/*
|
||||
* entries per page directory level: the i386 is two-level, so
|
||||
* we don't really have any PMD directory physically.
|
||||
*/
|
||||
#define PTRS_PER_PTE 1024
|
||||
#define USER_PTRS_PER_PGD ((TASK_SIZE + (PGDIR_SIZE - 1)) / PGDIR_SIZE)
|
||||
#define PTRS_PER_PGD 1024
|
||||
#define FIRST_USER_ADDRESS 0
|
||||
|
||||
#define pte_ERROR(e) \
|
||||
printk("%s:%d: bad pte %p(%08lx).\n", __FILE__, __LINE__, &(e), \
|
||||
pte_val(e))
|
||||
#define pgd_ERROR(e) \
|
||||
printk("%s:%d: bad pgd %p(%08lx).\n", __FILE__, __LINE__, &(e), \
|
||||
pgd_val(e))
|
||||
|
||||
static inline int pgd_newpage(pgd_t pgd) { return 0; }
|
||||
static inline void pgd_mkuptodate(pgd_t pgd) { }
|
||||
|
||||
#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
|
||||
|
||||
#define pte_pfn(x) phys_to_pfn(pte_val(x))
|
||||
#define pfn_pte(pfn, prot) __pte(pfn_to_phys(pfn) | pgprot_val(prot))
|
||||
#define pfn_pmd(pfn, prot) __pmd(pfn_to_phys(pfn) | pgprot_val(prot))
|
||||
|
||||
/*
|
||||
* Bits 0 through 4 are taken
|
||||
*/
|
||||
#define PTE_FILE_MAX_BITS 27
|
||||
|
||||
#define pte_to_pgoff(pte) (pte_val(pte) >> 5)
|
||||
|
||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 5) + _PAGE_FILE })
|
||||
|
||||
#endif
|
146
arch/um/include/asm/pgtable-3level.h
Normal file
146
arch/um/include/asm/pgtable-3level.h
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright 2003 PathScale Inc
|
||||
* Derived from include/asm-i386/pgtable.h
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PGTABLE_3LEVEL_H
|
||||
#define __UM_PGTABLE_3LEVEL_H
|
||||
|
||||
#include <asm-generic/pgtable-nopud.h>
|
||||
|
||||
/* PGDIR_SHIFT determines what a third-level page table entry can map */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define PGDIR_SHIFT 30
|
||||
#else
|
||||
#define PGDIR_SHIFT 31
|
||||
#endif
|
||||
#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
|
||||
#define PGDIR_MASK (~(PGDIR_SIZE-1))
|
||||
|
||||
/* PMD_SHIFT determines the size of the area a second-level page table can
|
||||
* map
|
||||
*/
|
||||
|
||||
#define PMD_SHIFT 21
|
||||
#define PMD_SIZE (1UL << PMD_SHIFT)
|
||||
#define PMD_MASK (~(PMD_SIZE-1))
|
||||
|
||||
/*
|
||||
* entries per page directory level
|
||||
*/
|
||||
|
||||
#define PTRS_PER_PTE 512
|
||||
#ifdef CONFIG_64BIT
|
||||
#define PTRS_PER_PMD 512
|
||||
#define PTRS_PER_PGD 512
|
||||
#else
|
||||
#define PTRS_PER_PMD 1024
|
||||
#define PTRS_PER_PGD 1024
|
||||
#endif
|
||||
|
||||
#define USER_PTRS_PER_PGD ((TASK_SIZE + (PGDIR_SIZE - 1)) / PGDIR_SIZE)
|
||||
#define FIRST_USER_ADDRESS 0
|
||||
|
||||
#define pte_ERROR(e) \
|
||||
printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), \
|
||||
pte_val(e))
|
||||
#define pmd_ERROR(e) \
|
||||
printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
|
||||
pmd_val(e))
|
||||
#define pgd_ERROR(e) \
|
||||
printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
|
||||
pgd_val(e))
|
||||
|
||||
#define pud_none(x) (!(pud_val(x) & ~_PAGE_NEWPAGE))
|
||||
#define pud_bad(x) ((pud_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
|
||||
#define pud_present(x) (pud_val(x) & _PAGE_PRESENT)
|
||||
#define pud_populate(mm, pud, pmd) \
|
||||
set_pud(pud, __pud(_PAGE_TABLE + __pa(pmd)))
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define set_pud(pudptr, pudval) set_64bit((phys_t *) (pudptr), pud_val(pudval))
|
||||
#else
|
||||
#define set_pud(pudptr, pudval) (*(pudptr) = (pudval))
|
||||
#endif
|
||||
|
||||
static inline int pgd_newpage(pgd_t pgd)
|
||||
{
|
||||
return(pgd_val(pgd) & _PAGE_NEWPAGE);
|
||||
}
|
||||
|
||||
static inline void pgd_mkuptodate(pgd_t pgd) { pgd_val(pgd) &= ~_PAGE_NEWPAGE; }
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define set_pmd(pmdptr, pmdval) set_64bit((phys_t *) (pmdptr), pmd_val(pmdval))
|
||||
#else
|
||||
#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
|
||||
#endif
|
||||
|
||||
struct mm_struct;
|
||||
extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
|
||||
|
||||
static inline void pud_clear (pud_t *pud)
|
||||
{
|
||||
set_pud(pud, __pud(_PAGE_NEWPAGE));
|
||||
}
|
||||
|
||||
#define pud_page(pud) phys_to_page(pud_val(pud) & PAGE_MASK)
|
||||
#define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PAGE_MASK))
|
||||
|
||||
/* Find an entry in the second-level page table.. */
|
||||
#define pmd_offset(pud, address) ((pmd_t *) pud_page_vaddr(*(pud)) + \
|
||||
pmd_index(address))
|
||||
|
||||
static inline unsigned long pte_pfn(pte_t pte)
|
||||
{
|
||||
return phys_to_pfn(pte_val(pte));
|
||||
}
|
||||
|
||||
static inline pte_t pfn_pte(pfn_t page_nr, pgprot_t pgprot)
|
||||
{
|
||||
pte_t pte;
|
||||
phys_t phys = pfn_to_phys(page_nr);
|
||||
|
||||
pte_set_val(pte, phys, pgprot);
|
||||
return pte;
|
||||
}
|
||||
|
||||
static inline pmd_t pfn_pmd(pfn_t page_nr, pgprot_t pgprot)
|
||||
{
|
||||
return __pmd((page_nr << PAGE_SHIFT) | pgprot_val(pgprot));
|
||||
}
|
||||
|
||||
/*
|
||||
* Bits 0 through 3 are taken in the low part of the pte,
|
||||
* put the 32 bits of offset into the high part.
|
||||
*/
|
||||
#define PTE_FILE_MAX_BITS 32
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
#define pte_to_pgoff(p) ((p).pte >> 32)
|
||||
|
||||
#define pgoff_to_pte(off) ((pte_t) { ((off) << 32) | _PAGE_FILE })
|
||||
|
||||
#else
|
||||
|
||||
#define pte_to_pgoff(pte) ((pte).pte_high)
|
||||
|
||||
#define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
366
arch/um/include/asm/pgtable.h
Normal file
366
arch/um/include/asm/pgtable.h
Normal file
@@ -0,0 +1,366 @@
|
||||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
* Derived from include/asm-i386/pgtable.h
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PGTABLE_H
|
||||
#define __UM_PGTABLE_H
|
||||
|
||||
#include <asm/fixmap.h>
|
||||
|
||||
#define _PAGE_PRESENT 0x001
|
||||
#define _PAGE_NEWPAGE 0x002
|
||||
#define _PAGE_NEWPROT 0x004
|
||||
#define _PAGE_RW 0x020
|
||||
#define _PAGE_USER 0x040
|
||||
#define _PAGE_ACCESSED 0x080
|
||||
#define _PAGE_DIRTY 0x100
|
||||
/* If _PAGE_PRESENT is clear, we use these: */
|
||||
#define _PAGE_FILE 0x008 /* nonlinear file mapping, saved PTE; unset:swap */
|
||||
#define _PAGE_PROTNONE 0x010 /* if the user mapped it with PROT_NONE;
|
||||
pte_present gives true */
|
||||
|
||||
#ifdef CONFIG_3_LEVEL_PGTABLES
|
||||
#include "asm/pgtable-3level.h"
|
||||
#else
|
||||
#include "asm/pgtable-2level.h"
|
||||
#endif
|
||||
|
||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||
|
||||
/* zero page used for uninitialized stuff */
|
||||
extern unsigned long *empty_zero_page;
|
||||
|
||||
#define pgtable_cache_init() do ; while (0)
|
||||
|
||||
/* Just any arbitrary offset to the start of the vmalloc VM area: the
|
||||
* current 8MB value just means that there will be a 8MB "hole" after the
|
||||
* physical memory until the kernel virtual memory starts. That means that
|
||||
* any out-of-bounds memory accesses will hopefully be caught.
|
||||
* The vmalloc() routines leaves a hole of 4kB between each vmalloced
|
||||
* area for the same reason. ;)
|
||||
*/
|
||||
|
||||
extern unsigned long end_iomem;
|
||||
|
||||
#define VMALLOC_OFFSET (__va_space)
|
||||
#define VMALLOC_START ((end_iomem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
|
||||
#define PKMAP_BASE ((FIXADDR_START - LAST_PKMAP * PAGE_SIZE) & PMD_MASK)
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
# define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE)
|
||||
#else
|
||||
# define VMALLOC_END (FIXADDR_START-2*PAGE_SIZE)
|
||||
#endif
|
||||
|
||||
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
|
||||
#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
|
||||
#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
|
||||
#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
|
||||
#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
|
||||
#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
|
||||
|
||||
/*
|
||||
* The i386 can't do page protection for execute, and considers that the same
|
||||
* are read.
|
||||
* Also, write permissions imply read permissions. This is the closest we can
|
||||
* get..
|
||||
*/
|
||||
#define __P000 PAGE_NONE
|
||||
#define __P001 PAGE_READONLY
|
||||
#define __P010 PAGE_COPY
|
||||
#define __P011 PAGE_COPY
|
||||
#define __P100 PAGE_READONLY
|
||||
#define __P101 PAGE_READONLY
|
||||
#define __P110 PAGE_COPY
|
||||
#define __P111 PAGE_COPY
|
||||
|
||||
#define __S000 PAGE_NONE
|
||||
#define __S001 PAGE_READONLY
|
||||
#define __S010 PAGE_SHARED
|
||||
#define __S011 PAGE_SHARED
|
||||
#define __S100 PAGE_READONLY
|
||||
#define __S101 PAGE_READONLY
|
||||
#define __S110 PAGE_SHARED
|
||||
#define __S111 PAGE_SHARED
|
||||
|
||||
/*
|
||||
* ZERO_PAGE is a global shared page that is always zero: used
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
#define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page)
|
||||
|
||||
#define pte_clear(mm,addr,xp) pte_set_val(*(xp), (phys_t) 0, __pgprot(_PAGE_NEWPAGE))
|
||||
|
||||
#define pmd_none(x) (!((unsigned long)pmd_val(x) & ~_PAGE_NEWPAGE))
|
||||
#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
|
||||
|
||||
#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
|
||||
#define pmd_clear(xp) do { pmd_val(*(xp)) = _PAGE_NEWPAGE; } while (0)
|
||||
|
||||
#define pmd_newpage(x) (pmd_val(x) & _PAGE_NEWPAGE)
|
||||
#define pmd_mkuptodate(x) (pmd_val(x) &= ~_PAGE_NEWPAGE)
|
||||
|
||||
#define pud_newpage(x) (pud_val(x) & _PAGE_NEWPAGE)
|
||||
#define pud_mkuptodate(x) (pud_val(x) &= ~_PAGE_NEWPAGE)
|
||||
|
||||
#define pmd_page(pmd) phys_to_page(pmd_val(pmd) & PAGE_MASK)
|
||||
|
||||
#define pte_page(x) pfn_to_page(pte_pfn(x))
|
||||
|
||||
#define pte_present(x) pte_get_bits(x, (_PAGE_PRESENT | _PAGE_PROTNONE))
|
||||
|
||||
/*
|
||||
* =================================
|
||||
* Flags checking section.
|
||||
* =================================
|
||||
*/
|
||||
|
||||
static inline int pte_none(pte_t pte)
|
||||
{
|
||||
return pte_is_zero(pte);
|
||||
}
|
||||
|
||||
/*
|
||||
* The following only work if pte_present() is true.
|
||||
* Undefined behaviour if not..
|
||||
*/
|
||||
static inline int pte_read(pte_t pte)
|
||||
{
|
||||
return((pte_get_bits(pte, _PAGE_USER)) &&
|
||||
!(pte_get_bits(pte, _PAGE_PROTNONE)));
|
||||
}
|
||||
|
||||
static inline int pte_exec(pte_t pte){
|
||||
return((pte_get_bits(pte, _PAGE_USER)) &&
|
||||
!(pte_get_bits(pte, _PAGE_PROTNONE)));
|
||||
}
|
||||
|
||||
static inline int pte_write(pte_t pte)
|
||||
{
|
||||
return((pte_get_bits(pte, _PAGE_RW)) &&
|
||||
!(pte_get_bits(pte, _PAGE_PROTNONE)));
|
||||
}
|
||||
|
||||
/*
|
||||
* The following only works if pte_present() is not true.
|
||||
*/
|
||||
static inline int pte_file(pte_t pte)
|
||||
{
|
||||
return pte_get_bits(pte, _PAGE_FILE);
|
||||
}
|
||||
|
||||
static inline int pte_dirty(pte_t pte)
|
||||
{
|
||||
return pte_get_bits(pte, _PAGE_DIRTY);
|
||||
}
|
||||
|
||||
static inline int pte_young(pte_t pte)
|
||||
{
|
||||
return pte_get_bits(pte, _PAGE_ACCESSED);
|
||||
}
|
||||
|
||||
static inline int pte_newpage(pte_t pte)
|
||||
{
|
||||
return pte_get_bits(pte, _PAGE_NEWPAGE);
|
||||
}
|
||||
|
||||
static inline int pte_newprot(pte_t pte)
|
||||
{
|
||||
return(pte_present(pte) && (pte_get_bits(pte, _PAGE_NEWPROT)));
|
||||
}
|
||||
|
||||
static inline int pte_special(pte_t pte)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* =================================
|
||||
* Flags setting section.
|
||||
* =================================
|
||||
*/
|
||||
|
||||
static inline pte_t pte_mknewprot(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_NEWPROT);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkclean(pte_t pte)
|
||||
{
|
||||
pte_clear_bits(pte, _PAGE_DIRTY);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkold(pte_t pte)
|
||||
{
|
||||
pte_clear_bits(pte, _PAGE_ACCESSED);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_wrprotect(pte_t pte)
|
||||
{
|
||||
pte_clear_bits(pte, _PAGE_RW);
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkread(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_USER);
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkdirty(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_DIRTY);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkyoung(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_ACCESSED);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkwrite(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_RW);
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkuptodate(pte_t pte)
|
||||
{
|
||||
pte_clear_bits(pte, _PAGE_NEWPAGE);
|
||||
if(pte_present(pte))
|
||||
pte_clear_bits(pte, _PAGE_NEWPROT);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mknewpage(pte_t pte)
|
||||
{
|
||||
pte_set_bits(pte, _PAGE_NEWPAGE);
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkspecial(pte_t pte)
|
||||
{
|
||||
return(pte);
|
||||
}
|
||||
|
||||
static inline void set_pte(pte_t *pteptr, pte_t pteval)
|
||||
{
|
||||
pte_copy(*pteptr, pteval);
|
||||
|
||||
/* If it's a swap entry, it needs to be marked _PAGE_NEWPAGE so
|
||||
* fix_range knows to unmap it. _PAGE_NEWPROT is specific to
|
||||
* mapped pages.
|
||||
*/
|
||||
|
||||
*pteptr = pte_mknewpage(*pteptr);
|
||||
if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr);
|
||||
}
|
||||
#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
|
||||
|
||||
/*
|
||||
* Conversion functions: convert a page and protection to a page entry,
|
||||
* and a page entry and page directory to the page they refer to.
|
||||
*/
|
||||
|
||||
#define phys_to_page(phys) pfn_to_page(phys_to_pfn(phys))
|
||||
#define __virt_to_page(virt) phys_to_page(__pa(virt))
|
||||
#define page_to_phys(page) pfn_to_phys((pfn_t) page_to_pfn(page))
|
||||
#define virt_to_page(addr) __virt_to_page((const unsigned long) addr)
|
||||
|
||||
#define mk_pte(page, pgprot) \
|
||||
({ pte_t pte; \
|
||||
\
|
||||
pte_set_val(pte, page_to_phys(page), (pgprot)); \
|
||||
if (pte_present(pte)) \
|
||||
pte_mknewprot(pte_mknewpage(pte)); \
|
||||
pte;})
|
||||
|
||||
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||
{
|
||||
pte_set_val(pte, (pte_val(pte) & _PAGE_CHG_MASK), newprot);
|
||||
return pte;
|
||||
}
|
||||
|
||||
/*
|
||||
* the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
|
||||
*
|
||||
* this macro returns the index of the entry in the pgd page which would
|
||||
* control the given virtual address
|
||||
*/
|
||||
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
|
||||
|
||||
/*
|
||||
* pgd_offset() returns a (pgd_t *)
|
||||
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
|
||||
*/
|
||||
#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
|
||||
|
||||
/*
|
||||
* a shortcut which implies the use of the kernel's pgd, instead
|
||||
* of a process's
|
||||
*/
|
||||
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
|
||||
|
||||
/*
|
||||
* the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD]
|
||||
*
|
||||
* this macro returns the index of the entry in the pmd page which would
|
||||
* control the given virtual address
|
||||
*/
|
||||
#define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
|
||||
#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
|
||||
|
||||
#define pmd_page_vaddr(pmd) \
|
||||
((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
|
||||
|
||||
/*
|
||||
* the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
|
||||
*
|
||||
* this macro returns the index of the entry in the pte page which would
|
||||
* control the given virtual address
|
||||
*/
|
||||
#define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
||||
#define pte_offset_kernel(dir, address) \
|
||||
((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(address))
|
||||
#define pte_offset_map(dir, address) \
|
||||
((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
|
||||
#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
|
||||
#define pte_unmap(pte) do { } while (0)
|
||||
#define pte_unmap_nested(pte) do { } while (0)
|
||||
|
||||
struct mm_struct;
|
||||
extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
|
||||
|
||||
#define update_mmu_cache(vma,address,pte) do ; while (0)
|
||||
|
||||
/* Encode and de-code a swap entry */
|
||||
#define __swp_type(x) (((x).val >> 4) & 0x3f)
|
||||
#define __swp_offset(x) ((x).val >> 11)
|
||||
|
||||
#define __swp_entry(type, offset) \
|
||||
((swp_entry_t) { ((type) << 4) | ((offset) << 11) })
|
||||
#define __pte_to_swp_entry(pte) \
|
||||
((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })
|
||||
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
||||
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
|
||||
/* Clear a kernel PTE and flush it from the TLB */
|
||||
#define kpte_clear_flush(ptep, vaddr) \
|
||||
do { \
|
||||
pte_clear(&init_mm, (vaddr), (ptep)); \
|
||||
__flush_tlb_one((vaddr)); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
136
arch/um/include/asm/processor-generic.h
Normal file
136
arch/um/include/asm/processor-generic.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PROCESSOR_GENERIC_H
|
||||
#define __UM_PROCESSOR_GENERIC_H
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
struct task_struct;
|
||||
|
||||
#include "asm/ptrace.h"
|
||||
#include "registers.h"
|
||||
#include "sysdep/archsetjmp.h"
|
||||
|
||||
struct mm_struct;
|
||||
|
||||
struct thread_struct {
|
||||
struct task_struct *saved_task;
|
||||
/*
|
||||
* This flag is set to 1 before calling do_fork (and analyzed in
|
||||
* copy_thread) to mark that we are begin called from userspace (fork /
|
||||
* vfork / clone), and reset to 0 after. It is left to 0 when called
|
||||
* from kernelspace (i.e. kernel_thread() or fork_idle(),
|
||||
* as of 2.6.11).
|
||||
*/
|
||||
int forking;
|
||||
struct pt_regs regs;
|
||||
int singlestep_syscall;
|
||||
void *fault_addr;
|
||||
jmp_buf *fault_catcher;
|
||||
struct task_struct *prev_sched;
|
||||
unsigned long temp_stack;
|
||||
jmp_buf *exec_buf;
|
||||
struct arch_thread arch;
|
||||
jmp_buf switch_buf;
|
||||
int mm_count;
|
||||
struct {
|
||||
int op;
|
||||
union {
|
||||
struct {
|
||||
int pid;
|
||||
} fork, exec;
|
||||
struct {
|
||||
int (*proc)(void *);
|
||||
void *arg;
|
||||
} thread;
|
||||
struct {
|
||||
void (*proc)(void *);
|
||||
void *arg;
|
||||
} cb;
|
||||
} u;
|
||||
} request;
|
||||
};
|
||||
|
||||
#define INIT_THREAD \
|
||||
{ \
|
||||
.forking = 0, \
|
||||
.regs = EMPTY_REGS, \
|
||||
.fault_addr = NULL, \
|
||||
.prev_sched = NULL, \
|
||||
.temp_stack = 0, \
|
||||
.exec_buf = NULL, \
|
||||
.arch = INIT_ARCH_THREAD, \
|
||||
.request = { 0 } \
|
||||
}
|
||||
|
||||
extern struct task_struct *alloc_task_struct(void);
|
||||
|
||||
static inline void release_thread(struct task_struct *task)
|
||||
{
|
||||
}
|
||||
|
||||
extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
||||
|
||||
static inline void prepare_to_copy(struct task_struct *tsk)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
extern unsigned long thread_saved_pc(struct task_struct *t);
|
||||
|
||||
static inline void mm_copy_segments(struct mm_struct *from_mm,
|
||||
struct mm_struct *new_mm)
|
||||
{
|
||||
}
|
||||
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
/*
|
||||
* User space process size: 3GB (default).
|
||||
*/
|
||||
extern unsigned long task_size;
|
||||
|
||||
#define TASK_SIZE (task_size)
|
||||
|
||||
#undef STACK_TOP
|
||||
#undef STACK_TOP_MAX
|
||||
|
||||
extern unsigned long stacksizelim;
|
||||
|
||||
#define STACK_ROOM (stacksizelim)
|
||||
#define STACK_TOP (TASK_SIZE - 2 * PAGE_SIZE)
|
||||
#define STACK_TOP_MAX STACK_TOP
|
||||
|
||||
/* This decides where the kernel will search for a free chunk of vm
|
||||
* space during mmap's.
|
||||
*/
|
||||
#define TASK_UNMAPPED_BASE (0x40000000)
|
||||
|
||||
extern void start_thread(struct pt_regs *regs, unsigned long entry,
|
||||
unsigned long stack);
|
||||
|
||||
struct cpuinfo_um {
|
||||
unsigned long loops_per_jiffy;
|
||||
int ipi_pipe[2];
|
||||
};
|
||||
|
||||
extern struct cpuinfo_um boot_cpu_data;
|
||||
|
||||
#define my_cpu_data cpu_data[smp_processor_id()]
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern struct cpuinfo_um cpu_data[];
|
||||
#define current_cpu_data cpu_data[smp_processor_id()]
|
||||
#else
|
||||
#define cpu_data (&boot_cpu_data)
|
||||
#define current_cpu_data boot_cpu_data
|
||||
#endif
|
||||
|
||||
|
||||
#define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
|
||||
extern unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
#endif
|
55
arch/um/include/asm/ptrace-generic.h
Normal file
55
arch/um/include/asm/ptrace-generic.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_PTRACE_GENERIC_H
|
||||
#define __UM_PTRACE_GENERIC_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/ptrace-abi.h>
|
||||
#include <asm/user.h>
|
||||
#include "sysdep/ptrace.h"
|
||||
|
||||
struct pt_regs {
|
||||
struct uml_pt_regs regs;
|
||||
};
|
||||
|
||||
#define EMPTY_REGS { .regs = EMPTY_UML_PT_REGS }
|
||||
|
||||
#define PT_REGS_IP(r) UPT_IP(&(r)->regs)
|
||||
#define PT_REGS_SP(r) UPT_SP(&(r)->regs)
|
||||
|
||||
#define PT_REG(r, reg) UPT_REG(&(r)->regs, reg)
|
||||
#define PT_REGS_SET(r, reg, val) UPT_SET(&(r)->regs, reg, val)
|
||||
|
||||
#define PT_REGS_SET_SYSCALL_RETURN(r, res) \
|
||||
UPT_SET_SYSCALL_RETURN(&(r)->regs, res)
|
||||
#define PT_REGS_RESTART_SYSCALL(r) UPT_RESTART_SYSCALL(&(r)->regs)
|
||||
|
||||
#define PT_REGS_SYSCALL_NR(r) UPT_SYSCALL_NR(&(r)->regs)
|
||||
|
||||
#define PT_REGS_SC(r) UPT_SC(&(r)->regs)
|
||||
|
||||
#define instruction_pointer(regs) PT_REGS_IP(regs)
|
||||
|
||||
struct task_struct;
|
||||
|
||||
extern long subarch_ptrace(struct task_struct *child, long request, long addr,
|
||||
long data);
|
||||
extern unsigned long getreg(struct task_struct *child, int regno);
|
||||
extern int putreg(struct task_struct *child, int regno, unsigned long value);
|
||||
extern int get_fpregs(struct user_i387_struct __user *buf,
|
||||
struct task_struct *child);
|
||||
extern int set_fpregs(struct user_i387_struct __user *buf,
|
||||
struct task_struct *child);
|
||||
|
||||
extern void show_regs(struct pt_regs *regs);
|
||||
|
||||
extern int arch_copy_tls(struct task_struct *new);
|
||||
extern void clear_flushed_tls(struct task_struct *task);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
9
arch/um/include/asm/required-features.h
Normal file
9
arch/um/include/asm/required-features.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef __UM_REQUIRED_FEATURES_H
|
||||
#define __UM_REQUIRED_FEATURES_H
|
||||
|
||||
/*
|
||||
* Nothing to see, just need something for the i386 and x86_64 asm
|
||||
* headers to include.
|
||||
*/
|
||||
|
||||
#endif
|
7
arch/um/include/asm/sections.h
Normal file
7
arch/um/include/asm/sections.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef _UM_SECTIONS_H
|
||||
#define _UM_SECTIONS_H
|
||||
|
||||
/* nothing to see, move along */
|
||||
#include <asm-generic/sections.h>
|
||||
|
||||
#endif
|
10
arch/um/include/asm/segment.h
Normal file
10
arch/um/include/asm/segment.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef __UM_SEGMENT_H
|
||||
#define __UM_SEGMENT_H
|
||||
|
||||
extern int host_gdt_entry_tls_min;
|
||||
|
||||
#define GDT_ENTRY_TLS_ENTRIES 3
|
||||
#define GDT_ENTRY_TLS_MIN host_gdt_entry_tls_min
|
||||
#define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
|
||||
|
||||
#endif
|
10
arch/um/include/asm/setup.h
Normal file
10
arch/um/include/asm/setup.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef SETUP_H_INCLUDED
|
||||
#define SETUP_H_INCLUDED
|
||||
|
||||
/* POSIX mandated with _POSIX_ARG_MAX that we can rely on 4096 chars in the
|
||||
* command line, so this choice is ok.
|
||||
*/
|
||||
|
||||
#define COMMAND_LINE_SIZE 4096
|
||||
|
||||
#endif /* SETUP_H_INCLUDED */
|
33
arch/um/include/asm/smp.h
Normal file
33
arch/um/include/asm/smp.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef __UM_SMP_H
|
||||
#define __UM_SMP_H
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
#include "linux/bitops.h"
|
||||
#include "asm/current.h"
|
||||
#include "linux/cpumask.h"
|
||||
|
||||
#define raw_smp_processor_id() (current_thread->cpu)
|
||||
|
||||
#define cpu_logical_map(n) (n)
|
||||
#define cpu_number_map(n) (n)
|
||||
#define PROC_CHANGE_PENALTY 15 /* Pick a number, any number */
|
||||
extern int hard_smp_processor_id(void);
|
||||
#define NO_PROC_ID -1
|
||||
|
||||
extern int ncpus;
|
||||
|
||||
|
||||
static inline void smp_cpus_done(unsigned int maxcpus)
|
||||
{
|
||||
}
|
||||
|
||||
extern struct task_struct *idle_threads[NR_CPUS];
|
||||
|
||||
#else
|
||||
|
||||
#define hard_smp_processor_id() 0
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
4
arch/um/include/asm/suspend.h
Normal file
4
arch/um/include/asm/suspend.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#ifndef __UM_SUSPEND_H
|
||||
#define __UM_SUSPEND_H
|
||||
|
||||
#endif
|
35
arch/um/include/asm/system.h
Normal file
35
arch/um/include/asm/system.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#ifndef __UM_SYSTEM_GENERIC_H
|
||||
#define __UM_SYSTEM_GENERIC_H
|
||||
|
||||
#include "sysdep/system.h"
|
||||
|
||||
extern void *switch_to(void *prev, void *next, void *last);
|
||||
|
||||
extern int get_signals(void);
|
||||
extern int set_signals(int enable);
|
||||
extern int get_signals(void);
|
||||
extern void block_signals(void);
|
||||
extern void unblock_signals(void);
|
||||
|
||||
#define raw_local_save_flags(flags) do { typecheck(unsigned long, flags); \
|
||||
(flags) = get_signals(); } while(0)
|
||||
#define raw_local_irq_restore(flags) do { typecheck(unsigned long, flags); \
|
||||
set_signals(flags); } while(0)
|
||||
|
||||
#define raw_local_irq_save(flags) do { raw_local_save_flags(flags); \
|
||||
raw_local_irq_disable(); } while(0)
|
||||
|
||||
#define raw_local_irq_enable() unblock_signals()
|
||||
#define raw_local_irq_disable() block_signals()
|
||||
|
||||
#define irqs_disabled() \
|
||||
({ \
|
||||
unsigned long flags; \
|
||||
raw_local_save_flags(flags); \
|
||||
(flags == 0); \
|
||||
})
|
||||
|
||||
extern void *_switch_to(void *prev, void *next, void *last);
|
||||
#define switch_to(prev, next, last) prev = _switch_to(prev, next, last)
|
||||
|
||||
#endif
|
83
arch/um/include/asm/thread_info.h
Normal file
83
arch/um/include/asm/thread_info.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_THREAD_INFO_H
|
||||
#define __UM_THREAD_INFO_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
struct thread_info {
|
||||
struct task_struct *task; /* main task structure */
|
||||
struct exec_domain *exec_domain; /* execution domain */
|
||||
unsigned long flags; /* low level flags */
|
||||
__u32 cpu; /* current CPU */
|
||||
int preempt_count; /* 0 => preemptable,
|
||||
<0 => BUG */
|
||||
mm_segment_t addr_limit; /* thread address space:
|
||||
0-0xBFFFFFFF for user
|
||||
0-0xFFFFFFFF for kernel */
|
||||
struct restart_block restart_block;
|
||||
struct thread_info *real_thread; /* Points to non-IRQ stack */
|
||||
};
|
||||
|
||||
#define INIT_THREAD_INFO(tsk) \
|
||||
{ \
|
||||
.task = &tsk, \
|
||||
.exec_domain = &default_exec_domain, \
|
||||
.flags = 0, \
|
||||
.cpu = 0, \
|
||||
.preempt_count = 1, \
|
||||
.addr_limit = KERNEL_DS, \
|
||||
.restart_block = { \
|
||||
.fn = do_no_restart_syscall, \
|
||||
}, \
|
||||
.real_thread = NULL, \
|
||||
}
|
||||
|
||||
#define init_thread_info (init_thread_union.thread_info)
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
|
||||
/* how to get the thread information struct from C */
|
||||
static inline struct thread_info *current_thread_info(void)
|
||||
{
|
||||
struct thread_info *ti;
|
||||
unsigned long mask = THREAD_SIZE - 1;
|
||||
ti = (struct thread_info *) (((unsigned long) &ti) & ~mask);
|
||||
return ti;
|
||||
}
|
||||
|
||||
#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
|
||||
|
||||
#endif
|
||||
|
||||
#define PREEMPT_ACTIVE 0x10000000
|
||||
|
||||
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
|
||||
#define TIF_SIGPENDING 1 /* signal pending */
|
||||
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
||||
#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
|
||||
* TIF_NEED_RESCHED
|
||||
*/
|
||||
#define TIF_RESTART_BLOCK 4
|
||||
#define TIF_MEMDIE 5
|
||||
#define TIF_SYSCALL_AUDIT 6
|
||||
#define TIF_RESTORE_SIGMASK 7
|
||||
#define TIF_FREEZE 16 /* is freezing for suspend */
|
||||
|
||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
|
||||
#define _TIF_MEMDIE (1 << TIF_MEMDIE)
|
||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||
#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
|
||||
#define _TIF_FREEZE (1 << TIF_FREEZE)
|
||||
|
||||
#endif
|
13
arch/um/include/asm/timex.h
Normal file
13
arch/um/include/asm/timex.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef __UM_TIMEX_H
|
||||
#define __UM_TIMEX_H
|
||||
|
||||
typedef unsigned long cycles_t;
|
||||
|
||||
static inline cycles_t get_cycles (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CLOCK_TICK_RATE (HZ)
|
||||
|
||||
#endif
|
127
arch/um/include/asm/tlb.h
Normal file
127
arch/um/include/asm/tlb.h
Normal file
@@ -0,0 +1,127 @@
|
||||
#ifndef __UM_TLB_H
|
||||
#define __UM_TLB_H
|
||||
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/swap.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
#define tlb_start_vma(tlb, vma) do { } while (0)
|
||||
#define tlb_end_vma(tlb, vma) do { } while (0)
|
||||
#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
|
||||
|
||||
/* struct mmu_gather is an opaque type used by the mm code for passing around
|
||||
* any data needed by arch specific code for tlb_remove_page.
|
||||
*/
|
||||
struct mmu_gather {
|
||||
struct mm_struct *mm;
|
||||
unsigned int need_flush; /* Really unmapped some ptes? */
|
||||
unsigned long start;
|
||||
unsigned long end;
|
||||
unsigned int fullmm; /* non-zero means full mm flush */
|
||||
};
|
||||
|
||||
/* Users of the generic TLB shootdown code must declare this storage space. */
|
||||
DECLARE_PER_CPU(struct mmu_gather, mmu_gathers);
|
||||
|
||||
static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
|
||||
unsigned long address)
|
||||
{
|
||||
if (tlb->start > address)
|
||||
tlb->start = address;
|
||||
if (tlb->end < address + PAGE_SIZE)
|
||||
tlb->end = address + PAGE_SIZE;
|
||||
}
|
||||
|
||||
static inline void init_tlb_gather(struct mmu_gather *tlb)
|
||||
{
|
||||
tlb->need_flush = 0;
|
||||
|
||||
tlb->start = TASK_SIZE;
|
||||
tlb->end = 0;
|
||||
|
||||
if (tlb->fullmm) {
|
||||
tlb->start = 0;
|
||||
tlb->end = TASK_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
/* tlb_gather_mmu
|
||||
* Return a pointer to an initialized struct mmu_gather.
|
||||
*/
|
||||
static inline struct mmu_gather *
|
||||
tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush)
|
||||
{
|
||||
struct mmu_gather *tlb = &get_cpu_var(mmu_gathers);
|
||||
|
||||
tlb->mm = mm;
|
||||
tlb->fullmm = full_mm_flush;
|
||||
|
||||
init_tlb_gather(tlb);
|
||||
|
||||
return tlb;
|
||||
}
|
||||
|
||||
extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
static inline void
|
||||
tlb_flush_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
||||
{
|
||||
if (!tlb->need_flush)
|
||||
return;
|
||||
|
||||
flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end);
|
||||
init_tlb_gather(tlb);
|
||||
}
|
||||
|
||||
/* tlb_finish_mmu
|
||||
* Called at the end of the shootdown operation to free up any resources
|
||||
* that were required.
|
||||
*/
|
||||
static inline void
|
||||
tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
||||
{
|
||||
tlb_flush_mmu(tlb, start, end);
|
||||
|
||||
/* keep the page table cache within bounds */
|
||||
check_pgt_cache();
|
||||
|
||||
put_cpu_var(mmu_gathers);
|
||||
}
|
||||
|
||||
/* tlb_remove_page
|
||||
* Must perform the equivalent to __free_pte(pte_get_and_clear(ptep)),
|
||||
* while handling the additional races in SMP caused by other CPUs
|
||||
* caching valid mappings in their TLBs.
|
||||
*/
|
||||
static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
{
|
||||
tlb->need_flush = 1;
|
||||
free_page_and_swap_cache(page);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* tlb_remove_tlb_entry - remember a pte unmapping for later tlb invalidation.
|
||||
*
|
||||
* Record the fact that pte's were really umapped in ->need_flush, so we can
|
||||
* later optimise away the tlb invalidate. This helps when userspace is
|
||||
* unmapping already-unmapped pages, which happens quite a lot.
|
||||
*/
|
||||
#define tlb_remove_tlb_entry(tlb, ptep, address) \
|
||||
do { \
|
||||
tlb->need_flush = 1; \
|
||||
__tlb_remove_tlb_entry(tlb, ptep, address); \
|
||||
} while (0)
|
||||
|
||||
#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep)
|
||||
|
||||
#define pud_free_tlb(tlb, pudp) __pud_free_tlb(tlb, pudp)
|
||||
|
||||
#define pmd_free_tlb(tlb, pmdp) __pmd_free_tlb(tlb, pmdp)
|
||||
|
||||
#define tlb_migrate_finish(mm) do {} while (0)
|
||||
|
||||
#endif
|
31
arch/um/include/asm/tlbflush.h
Normal file
31
arch/um/include/asm/tlbflush.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_TLBFLUSH_H
|
||||
#define __UM_TLBFLUSH_H
|
||||
|
||||
#include <linux/mm.h>
|
||||
|
||||
/*
|
||||
* TLB flushing:
|
||||
*
|
||||
* - flush_tlb() flushes the current mm struct TLBs
|
||||
* - flush_tlb_all() flushes all processes TLBs
|
||||
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
|
||||
* - flush_tlb_page(vma, vmaddr) flushes one page
|
||||
* - flush_tlb_kernel_vm() flushes the kernel vm area
|
||||
* - flush_tlb_range(vma, start, end) flushes a range of pages
|
||||
*/
|
||||
|
||||
extern void flush_tlb_all(void);
|
||||
extern void flush_tlb_mm(struct mm_struct *mm);
|
||||
extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
|
||||
unsigned long end);
|
||||
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long address);
|
||||
extern void flush_tlb_kernel_vm(void);
|
||||
extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
|
||||
extern void __flush_tlb_one(unsigned long addr);
|
||||
|
||||
#endif
|
6
arch/um/include/asm/topology.h
Normal file
6
arch/um/include/asm/topology.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_UM_TOPOLOGY_H
|
||||
#define _ASM_UM_TOPOLOGY_H
|
||||
|
||||
#include <asm-generic/topology.h>
|
||||
|
||||
#endif
|
99
arch/um/include/asm/uaccess.h
Normal file
99
arch/um/include/asm/uaccess.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#ifndef __UM_UACCESS_H
|
||||
#define __UM_UACCESS_H
|
||||
|
||||
#include <asm/errno.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
/* thread_info has a mm_segment_t in it, so put the definition up here */
|
||||
typedef struct {
|
||||
unsigned long seg;
|
||||
} mm_segment_t;
|
||||
|
||||
#include "linux/thread_info.h"
|
||||
|
||||
#define VERIFY_READ 0
|
||||
#define VERIFY_WRITE 1
|
||||
|
||||
/*
|
||||
* The fs value determines whether argument validity checking should be
|
||||
* performed or not. If get_fs() == USER_DS, checking is performed, with
|
||||
* get_fs() == KERNEL_DS, checking is bypassed.
|
||||
*
|
||||
* For historical reasons, these macros are grossly misnamed.
|
||||
*/
|
||||
|
||||
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
|
||||
|
||||
#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
|
||||
#define USER_DS MAKE_MM_SEG(TASK_SIZE)
|
||||
|
||||
#define get_ds() (KERNEL_DS)
|
||||
#define get_fs() (current_thread_info()->addr_limit)
|
||||
#define set_fs(x) (current_thread_info()->addr_limit = (x))
|
||||
|
||||
#define segment_eq(a, b) ((a).seg == (b).seg)
|
||||
|
||||
#include "um_uaccess.h"
|
||||
|
||||
#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
|
||||
|
||||
#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
|
||||
|
||||
#define __copy_to_user_inatomic __copy_to_user
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
#define __get_user(x, ptr) \
|
||||
({ \
|
||||
const __typeof__(*(ptr)) __user *__private_ptr = (ptr); \
|
||||
__typeof__(x) __private_val; \
|
||||
int __private_ret = -EFAULT; \
|
||||
(x) = (__typeof__(*(__private_ptr)))0; \
|
||||
if (__copy_from_user((__force void *)&__private_val, (__private_ptr),\
|
||||
sizeof(*(__private_ptr))) == 0) { \
|
||||
(x) = (__typeof__(*(__private_ptr))) __private_val; \
|
||||
__private_ret = 0; \
|
||||
} \
|
||||
__private_ret; \
|
||||
})
|
||||
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
const __typeof__((*(ptr))) __user *private_ptr = (ptr); \
|
||||
(access_ok(VERIFY_READ, private_ptr, sizeof(*private_ptr)) ? \
|
||||
__get_user(x, private_ptr) : ((x) = (__typeof__(*ptr))0, -EFAULT)); \
|
||||
})
|
||||
|
||||
#define __put_user(x, ptr) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __user *__private_ptr = ptr; \
|
||||
__typeof__(*(__private_ptr)) __private_val; \
|
||||
int __private_ret = -EFAULT; \
|
||||
__private_val = (__typeof__(*(__private_ptr))) (x); \
|
||||
if (__copy_to_user((__private_ptr), &__private_val, \
|
||||
sizeof(*(__private_ptr))) == 0) { \
|
||||
__private_ret = 0; \
|
||||
} \
|
||||
__private_ret; \
|
||||
})
|
||||
|
||||
#define put_user(x, ptr) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __user *private_ptr = (ptr); \
|
||||
(access_ok(VERIFY_WRITE, private_ptr, sizeof(*private_ptr)) ? \
|
||||
__put_user(x, private_ptr) : -EFAULT); \
|
||||
})
|
||||
|
||||
#define strlen_user(str) strnlen_user(str, ~0U >> 1)
|
||||
|
||||
struct exception_table_entry
|
||||
{
|
||||
unsigned long insn;
|
||||
unsigned long fixup;
|
||||
};
|
||||
|
||||
#endif
|
6
arch/um/include/asm/xor.h
Normal file
6
arch/um/include/asm/xor.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef __UM_XOR_H
|
||||
#define __UM_XOR_H
|
||||
|
||||
#include "asm-generic/xor.h"
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user