Merge with master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
このコミットが含まれているのは:
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.11
|
||||
# Wed Mar 2 16:57:55 2005
|
||||
# Linux kernel version: 2.6.12-rc3
|
||||
# Fri Apr 22 15:30:58 2005
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
@@ -15,6 +15,7 @@ CONFIG_UID16=y
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
@@ -26,24 +27,25 @@ CONFIG_SYSVIPC=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
@@ -261,7 +263,6 @@ CONFIG_NET=y
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_NET_KEY=y
|
||||
CONFIG_INET=y
|
||||
@@ -329,6 +330,7 @@ CONFIG_NET_SCH_DSMARK=m
|
||||
CONFIG_NET_QOS=y
|
||||
CONFIG_NET_ESTIMATOR=y
|
||||
CONFIG_NET_CLS=y
|
||||
# CONFIG_NET_CLS_BASIC is not set
|
||||
CONFIG_NET_CLS_TCINDEX=m
|
||||
CONFIG_NET_CLS_ROUTE4=m
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
@@ -338,6 +340,7 @@ CONFIG_NET_CLS_U32=m
|
||||
# CONFIG_NET_CLS_IND is not set
|
||||
CONFIG_NET_CLS_RSVP=m
|
||||
CONFIG_NET_CLS_RSVP6=m
|
||||
# CONFIG_NET_EMATCH is not set
|
||||
# CONFIG_NET_CLS_ACT is not set
|
||||
CONFIG_NET_CLS_POLICE=y
|
||||
|
||||
@@ -393,6 +396,8 @@ CONFIG_CTC=m
|
||||
CONFIG_IUCV=m
|
||||
# CONFIG_NETIUCV is not set
|
||||
# CONFIG_SMSGIUCV is not set
|
||||
# CONFIG_CLAW is not set
|
||||
# CONFIG_MPC is not set
|
||||
CONFIG_QETH=y
|
||||
|
||||
#
|
||||
@@ -532,10 +537,13 @@ CONFIG_MSDOS_PARTITION=y
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
@@ -560,6 +568,7 @@ CONFIG_CRYPTO=y
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
# CONFIG_CRYPTO_DES is not set
|
||||
# CONFIG_CRYPTO_DES_Z990 is not set
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#define CODE
|
||||
#include "../../../fs/compat_ioctl.c"
|
||||
#include <asm/dasd.h>
|
||||
#include <asm/cmb.h>
|
||||
#include <asm/tape390.h>
|
||||
|
||||
static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd,
|
||||
@@ -58,7 +59,11 @@ COMPATIBLE_IOCTL(BIODASDPRRD)
|
||||
COMPATIBLE_IOCTL(BIODASDPSRD)
|
||||
COMPATIBLE_IOCTL(BIODASDGATTR)
|
||||
COMPATIBLE_IOCTL(BIODASDSATTR)
|
||||
|
||||
#if defined(CONFIG_DASD_CMB) || defined(CONFIG_DASD_CMB_MODULE)
|
||||
COMPATIBLE_IOCTL(BIODASDCMFENABLE)
|
||||
COMPATIBLE_IOCTL(BIODASDCMFDISABLE)
|
||||
COMPATIBLE_IOCTL(BIODASDREADALLCMB)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_S390_TAPE) || defined(CONFIG_S390_TAPE_MODULE)
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
@@ -609,7 +610,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
/* continue and stop at next (return from) syscall */
|
||||
case PTRACE_CONT:
|
||||
/* restart after signal. */
|
||||
if ((unsigned long) data >= _NSIG)
|
||||
if (!valid_signal(data))
|
||||
return -EIO;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
@@ -637,7 +638,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
|
||||
case PTRACE_SINGLESTEP:
|
||||
/* set the trap flag. */
|
||||
if ((unsigned long) data >= _NSIG)
|
||||
if (!valid_signal(data))
|
||||
return -EIO;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
child->exit_code = data;
|
||||
|
@@ -34,7 +34,6 @@ EXPORT_SYMBOL(__clear_user_asm);
|
||||
EXPORT_SYMBOL(__strncpy_from_user_asm);
|
||||
EXPORT_SYMBOL(__strnlen_user_asm);
|
||||
EXPORT_SYMBOL(diag10);
|
||||
EXPORT_SYMBOL(default_storage_key);
|
||||
|
||||
/*
|
||||
* semaphore ops
|
||||
|
@@ -44,6 +44,8 @@
|
||||
#include <asm/cpcmd.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
/*
|
||||
* Machine setup..
|
||||
@@ -53,13 +55,14 @@ unsigned int console_devno = -1;
|
||||
unsigned int console_irq = -1;
|
||||
unsigned long memory_size = 0;
|
||||
unsigned long machine_flags = 0;
|
||||
unsigned int default_storage_key = 0;
|
||||
struct {
|
||||
unsigned long addr, size, type;
|
||||
} memory_chunk[MEMORY_CHUNKS] = { { 0 } };
|
||||
#define CHUNK_READ_WRITE 0
|
||||
#define CHUNK_READ_ONLY 1
|
||||
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
|
||||
unsigned long __initdata zholes_size[MAX_NR_ZONES];
|
||||
static unsigned long __initdata memory_end;
|
||||
|
||||
/*
|
||||
* Setup options
|
||||
@@ -78,11 +81,15 @@ static char command_line[COMMAND_LINE_SIZE] = { 0, };
|
||||
|
||||
static struct resource code_resource = {
|
||||
.name = "Kernel code",
|
||||
.start = (unsigned long) &_text,
|
||||
.end = (unsigned long) &_etext - 1,
|
||||
.flags = IORESOURCE_BUSY | IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct resource data_resource = {
|
||||
.name = "Kernel data",
|
||||
.start = (unsigned long) &_etext,
|
||||
.end = (unsigned long) &_edata - 1,
|
||||
.flags = IORESOURCE_BUSY | IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
@@ -310,90 +317,50 @@ void machine_power_off(void)
|
||||
|
||||
EXPORT_SYMBOL(machine_power_off);
|
||||
|
||||
/*
|
||||
* Setup function called from init/main.c just after the banner
|
||||
* was printed.
|
||||
*/
|
||||
extern char _pstart, _pend, _stext;
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
static void __init
|
||||
add_memory_hole(unsigned long start, unsigned long end)
|
||||
{
|
||||
unsigned long bootmap_size;
|
||||
unsigned long memory_start, memory_end;
|
||||
char c = ' ', cn, *to = command_line, *from = COMMAND_LINE;
|
||||
unsigned long start_pfn, end_pfn;
|
||||
static unsigned int smptrap=0;
|
||||
unsigned long delay = 0;
|
||||
struct _lowcore *lc;
|
||||
int i;
|
||||
unsigned long dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT;
|
||||
|
||||
if (smptrap)
|
||||
return;
|
||||
smptrap=1;
|
||||
if (end <= dma_pfn)
|
||||
zholes_size[ZONE_DMA] += end - start + 1;
|
||||
else if (start > dma_pfn)
|
||||
zholes_size[ZONE_NORMAL] += end - start + 1;
|
||||
else {
|
||||
zholes_size[ZONE_DMA] += dma_pfn - start + 1;
|
||||
zholes_size[ZONE_NORMAL] += end - dma_pfn;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* print what head.S has found out about the machine
|
||||
*/
|
||||
#ifndef CONFIG_ARCH_S390X
|
||||
printk((MACHINE_IS_VM) ?
|
||||
"We are running under VM (31 bit mode)\n" :
|
||||
"We are running native (31 bit mode)\n");
|
||||
printk((MACHINE_HAS_IEEE) ?
|
||||
"This machine has an IEEE fpu\n" :
|
||||
"This machine has no IEEE fpu\n");
|
||||
#else /* CONFIG_ARCH_S390X */
|
||||
printk((MACHINE_IS_VM) ?
|
||||
"We are running under VM (64 bit mode)\n" :
|
||||
"We are running native (64 bit mode)\n");
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
static void __init
|
||||
parse_cmdline_early(char **cmdline_p)
|
||||
{
|
||||
char c = ' ', cn, *to = command_line, *from = COMMAND_LINE;
|
||||
unsigned long delay = 0;
|
||||
|
||||
ROOT_DEV = Root_RAM0;
|
||||
memory_start = (unsigned long) &_end; /* fixit if use $CODELO etc*/
|
||||
#ifndef CONFIG_ARCH_S390X
|
||||
memory_end = memory_size & ~0x400000UL; /* align memory end to 4MB */
|
||||
/*
|
||||
* We need some free virtual space to be able to do vmalloc.
|
||||
* On a machine with 2GB memory we make sure that we have at
|
||||
* least 128 MB free space for vmalloc.
|
||||
*/
|
||||
if (memory_end > 1920*1024*1024)
|
||||
memory_end = 1920*1024*1024;
|
||||
#else /* CONFIG_ARCH_S390X */
|
||||
memory_end = memory_size & ~0x200000UL; /* detected in head.s */
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
init_mm.start_code = PAGE_OFFSET;
|
||||
init_mm.end_code = (unsigned long) &_etext;
|
||||
init_mm.end_data = (unsigned long) &_edata;
|
||||
init_mm.brk = (unsigned long) &_end;
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
|
||||
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
|
||||
|
||||
code_resource.start = (unsigned long) &_text;
|
||||
code_resource.end = (unsigned long) &_etext - 1;
|
||||
data_resource.start = (unsigned long) &_etext;
|
||||
data_resource.end = (unsigned long) &_edata - 1;
|
||||
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
|
||||
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
|
||||
|
||||
for (;;) {
|
||||
/*
|
||||
* "mem=XXX[kKmM]" sets memsize
|
||||
*/
|
||||
if (c == ' ' && strncmp(from, "mem=", 4) == 0) {
|
||||
memory_end = simple_strtoul(from+4, &from, 0);
|
||||
if ( *from == 'K' || *from == 'k' ) {
|
||||
memory_end = memory_end << 10;
|
||||
from++;
|
||||
} else if ( *from == 'M' || *from == 'm' ) {
|
||||
memory_end = memory_end << 20;
|
||||
from++;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes
|
||||
*/
|
||||
if (c == ' ' && strncmp(from, "ipldelay=", 9) == 0) {
|
||||
delay = simple_strtoul(from+9, &from, 0);
|
||||
for (;;) {
|
||||
/*
|
||||
* "mem=XXX[kKmM]" sets memsize
|
||||
*/
|
||||
if (c == ' ' && strncmp(from, "mem=", 4) == 0) {
|
||||
memory_end = simple_strtoul(from+4, &from, 0);
|
||||
if ( *from == 'K' || *from == 'k' ) {
|
||||
memory_end = memory_end << 10;
|
||||
from++;
|
||||
} else if ( *from == 'M' || *from == 'm' ) {
|
||||
memory_end = memory_end << 20;
|
||||
from++;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes
|
||||
*/
|
||||
if (c == ' ' && strncmp(from, "ipldelay=", 9) == 0) {
|
||||
delay = simple_strtoul(from+9, &from, 0);
|
||||
if (*from == 's' || *from == 'S') {
|
||||
delay = delay*1000000;
|
||||
from++;
|
||||
@@ -403,116 +370,40 @@ void __init setup_arch(char **cmdline_p)
|
||||
}
|
||||
/* now wait for the requested amount of time */
|
||||
udelay(delay);
|
||||
}
|
||||
cn = *(from++);
|
||||
if (!cn)
|
||||
break;
|
||||
if (cn == '\n')
|
||||
cn = ' '; /* replace newlines with space */
|
||||
}
|
||||
cn = *(from++);
|
||||
if (!cn)
|
||||
break;
|
||||
if (cn == '\n')
|
||||
cn = ' '; /* replace newlines with space */
|
||||
if (cn == 0x0d)
|
||||
cn = ' '; /* replace 0x0d with space */
|
||||
if (cn == ' ' && c == ' ')
|
||||
continue; /* remove additional spaces */
|
||||
c = cn;
|
||||
if (to - command_line >= COMMAND_LINE_SIZE)
|
||||
break;
|
||||
*(to++) = c;
|
||||
}
|
||||
if (c == ' ' && to > command_line) to--;
|
||||
*to = '\0';
|
||||
*cmdline_p = command_line;
|
||||
|
||||
/*
|
||||
* partially used pages are not usable - thus
|
||||
* we are rounding upwards:
|
||||
*/
|
||||
start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
end_pfn = max_pfn = memory_end >> PAGE_SHIFT;
|
||||
|
||||
/*
|
||||
* Initialize the boot-time allocator (with low memory only):
|
||||
*/
|
||||
bootmap_size = init_bootmem(start_pfn, end_pfn);
|
||||
|
||||
/*
|
||||
* Register RAM areas with the bootmem allocator.
|
||||
*/
|
||||
for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) {
|
||||
unsigned long start_chunk, end_chunk;
|
||||
|
||||
if (memory_chunk[i].type != CHUNK_READ_WRITE)
|
||||
continue;
|
||||
start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1);
|
||||
start_chunk >>= PAGE_SHIFT;
|
||||
end_chunk = (memory_chunk[i].addr + memory_chunk[i].size);
|
||||
end_chunk >>= PAGE_SHIFT;
|
||||
if (start_chunk < start_pfn)
|
||||
start_chunk = start_pfn;
|
||||
if (end_chunk > end_pfn)
|
||||
end_chunk = end_pfn;
|
||||
if (start_chunk < end_chunk)
|
||||
free_bootmem(start_chunk << PAGE_SHIFT,
|
||||
(end_chunk - start_chunk) << PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reserve the bootmem bitmap itself as well. We do this in two
|
||||
* steps (first step was init_bootmem()) because this catches
|
||||
* the (very unlikely) case of us accidentally initializing the
|
||||
* bootmem allocator with an invalid RAM area.
|
||||
*/
|
||||
reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (INITRD_START) {
|
||||
if (INITRD_START + INITRD_SIZE <= memory_end) {
|
||||
reserve_bootmem(INITRD_START, INITRD_SIZE);
|
||||
initrd_start = INITRD_START;
|
||||
initrd_end = initrd_start + INITRD_SIZE;
|
||||
} else {
|
||||
printk("initrd extends beyond end of memory "
|
||||
"(0x%08lx > 0x%08lx)\ndisabling initrd\n",
|
||||
initrd_start + INITRD_SIZE, memory_end);
|
||||
initrd_start = initrd_end = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) {
|
||||
struct resource *res;
|
||||
|
||||
res = alloc_bootmem_low(sizeof(struct resource));
|
||||
res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
|
||||
|
||||
switch (memory_chunk[i].type) {
|
||||
case CHUNK_READ_WRITE:
|
||||
res->name = "System RAM";
|
||||
if (cn == ' ' && c == ' ')
|
||||
continue; /* remove additional spaces */
|
||||
c = cn;
|
||||
if (to - command_line >= COMMAND_LINE_SIZE)
|
||||
break;
|
||||
case CHUNK_READ_ONLY:
|
||||
res->name = "System ROM";
|
||||
res->flags |= IORESOURCE_READONLY;
|
||||
break;
|
||||
default:
|
||||
res->name = "reserved";
|
||||
}
|
||||
res->start = memory_chunk[i].addr;
|
||||
res->end = memory_chunk[i].addr + memory_chunk[i].size - 1;
|
||||
request_resource(&iomem_resource, res);
|
||||
request_resource(res, &code_resource);
|
||||
request_resource(res, &data_resource);
|
||||
*(to++) = c;
|
||||
}
|
||||
if (c == ' ' && to > command_line) to--;
|
||||
*to = '\0';
|
||||
*cmdline_p = command_line;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup lowcore for boot cpu
|
||||
*/
|
||||
#ifndef CONFIG_ARCH_S390X
|
||||
lc = (struct _lowcore *) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0);
|
||||
memset(lc, 0, PAGE_SIZE);
|
||||
#else /* CONFIG_ARCH_S390X */
|
||||
lc = (struct _lowcore *) __alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0);
|
||||
memset(lc, 0, 2*PAGE_SIZE);
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
lc->restart_psw.mask = PSW_BASE_BITS;
|
||||
static void __init
|
||||
setup_lowcore(void)
|
||||
{
|
||||
struct _lowcore *lc;
|
||||
int lc_pages;
|
||||
|
||||
/*
|
||||
* Setup lowcore for boot cpu
|
||||
*/
|
||||
lc_pages = sizeof(void *) == 8 ? 2 : 1;
|
||||
lc = (struct _lowcore *)
|
||||
__alloc_bootmem(lc_pages * PAGE_SIZE, lc_pages * PAGE_SIZE, 0);
|
||||
memset(lc, 0, lc_pages * PAGE_SIZE);
|
||||
lc->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY;
|
||||
lc->restart_psw.addr =
|
||||
PSW_ADDR_AMODE | (unsigned long) restart_int_handler;
|
||||
lc->external_new_psw.mask = PSW_KERNEL_BITS;
|
||||
@@ -546,6 +437,170 @@ void __init setup_arch(char **cmdline_p)
|
||||
lc->diag44_opcode = 0x07000700;
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
set_prefix((u32)(unsigned long) lc);
|
||||
}
|
||||
|
||||
static void __init
|
||||
setup_resources(void)
|
||||
{
|
||||
struct resource *res;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) {
|
||||
res = alloc_bootmem_low(sizeof(struct resource));
|
||||
res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
|
||||
switch (memory_chunk[i].type) {
|
||||
case CHUNK_READ_WRITE:
|
||||
res->name = "System RAM";
|
||||
break;
|
||||
case CHUNK_READ_ONLY:
|
||||
res->name = "System ROM";
|
||||
res->flags |= IORESOURCE_READONLY;
|
||||
break;
|
||||
default:
|
||||
res->name = "reserved";
|
||||
}
|
||||
res->start = memory_chunk[i].addr;
|
||||
res->end = memory_chunk[i].addr + memory_chunk[i].size - 1;
|
||||
request_resource(&iomem_resource, res);
|
||||
request_resource(res, &code_resource);
|
||||
request_resource(res, &data_resource);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init
|
||||
setup_memory(void)
|
||||
{
|
||||
unsigned long bootmap_size;
|
||||
unsigned long start_pfn, end_pfn, init_pfn;
|
||||
unsigned long last_rw_end;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* partially used pages are not usable - thus
|
||||
* we are rounding upwards:
|
||||
*/
|
||||
start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
end_pfn = max_pfn = memory_end >> PAGE_SHIFT;
|
||||
|
||||
/* Initialize storage key for kernel pages */
|
||||
for (init_pfn = 0 ; init_pfn < start_pfn; init_pfn++)
|
||||
page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY);
|
||||
|
||||
/*
|
||||
* Initialize the boot-time allocator (with low memory only):
|
||||
*/
|
||||
bootmap_size = init_bootmem(start_pfn, end_pfn);
|
||||
|
||||
/*
|
||||
* Register RAM areas with the bootmem allocator.
|
||||
*/
|
||||
last_rw_end = start_pfn;
|
||||
|
||||
for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) {
|
||||
unsigned long start_chunk, end_chunk;
|
||||
|
||||
if (memory_chunk[i].type != CHUNK_READ_WRITE)
|
||||
continue;
|
||||
start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1);
|
||||
start_chunk >>= PAGE_SHIFT;
|
||||
end_chunk = (memory_chunk[i].addr + memory_chunk[i].size);
|
||||
end_chunk >>= PAGE_SHIFT;
|
||||
if (start_chunk < start_pfn)
|
||||
start_chunk = start_pfn;
|
||||
if (end_chunk > end_pfn)
|
||||
end_chunk = end_pfn;
|
||||
if (start_chunk < end_chunk) {
|
||||
/* Initialize storage key for RAM pages */
|
||||
for (init_pfn = start_chunk ; init_pfn < end_chunk;
|
||||
init_pfn++)
|
||||
page_set_storage_key(init_pfn << PAGE_SHIFT,
|
||||
PAGE_DEFAULT_KEY);
|
||||
free_bootmem(start_chunk << PAGE_SHIFT,
|
||||
(end_chunk - start_chunk) << PAGE_SHIFT);
|
||||
if (last_rw_end < start_chunk)
|
||||
add_memory_hole(last_rw_end, start_chunk - 1);
|
||||
last_rw_end = end_chunk;
|
||||
}
|
||||
}
|
||||
|
||||
psw_set_key(PAGE_DEFAULT_KEY);
|
||||
|
||||
if (last_rw_end < end_pfn - 1)
|
||||
add_memory_hole(last_rw_end, end_pfn - 1);
|
||||
|
||||
/*
|
||||
* Reserve the bootmem bitmap itself as well. We do this in two
|
||||
* steps (first step was init_bootmem()) because this catches
|
||||
* the (very unlikely) case of us accidentally initializing the
|
||||
* bootmem allocator with an invalid RAM area.
|
||||
*/
|
||||
reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (INITRD_START) {
|
||||
if (INITRD_START + INITRD_SIZE <= memory_end) {
|
||||
reserve_bootmem(INITRD_START, INITRD_SIZE);
|
||||
initrd_start = INITRD_START;
|
||||
initrd_end = initrd_start + INITRD_SIZE;
|
||||
} else {
|
||||
printk("initrd extends beyond end of memory "
|
||||
"(0x%08lx > 0x%08lx)\ndisabling initrd\n",
|
||||
initrd_start + INITRD_SIZE, memory_end);
|
||||
initrd_start = initrd_end = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup function called from init/main.c just after the banner
|
||||
* was printed.
|
||||
*/
|
||||
|
||||
void __init
|
||||
setup_arch(char **cmdline_p)
|
||||
{
|
||||
/*
|
||||
* print what head.S has found out about the machine
|
||||
*/
|
||||
#ifndef CONFIG_ARCH_S390X
|
||||
printk((MACHINE_IS_VM) ?
|
||||
"We are running under VM (31 bit mode)\n" :
|
||||
"We are running native (31 bit mode)\n");
|
||||
printk((MACHINE_HAS_IEEE) ?
|
||||
"This machine has an IEEE fpu\n" :
|
||||
"This machine has no IEEE fpu\n");
|
||||
#else /* CONFIG_ARCH_S390X */
|
||||
printk((MACHINE_IS_VM) ?
|
||||
"We are running under VM (64 bit mode)\n" :
|
||||
"We are running native (64 bit mode)\n");
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
|
||||
ROOT_DEV = Root_RAM0;
|
||||
#ifndef CONFIG_ARCH_S390X
|
||||
memory_end = memory_size & ~0x400000UL; /* align memory end to 4MB */
|
||||
/*
|
||||
* We need some free virtual space to be able to do vmalloc.
|
||||
* On a machine with 2GB memory we make sure that we have at
|
||||
* least 128 MB free space for vmalloc.
|
||||
*/
|
||||
if (memory_end > 1920*1024*1024)
|
||||
memory_end = 1920*1024*1024;
|
||||
#else /* CONFIG_ARCH_S390X */
|
||||
memory_end = memory_size & ~0x200000UL; /* detected in head.s */
|
||||
#endif /* CONFIG_ARCH_S390X */
|
||||
|
||||
init_mm.start_code = PAGE_OFFSET;
|
||||
init_mm.end_code = (unsigned long) &_etext;
|
||||
init_mm.end_data = (unsigned long) &_edata;
|
||||
init_mm.brk = (unsigned long) &_end;
|
||||
|
||||
parse_cmdline_early(cmdline_p);
|
||||
|
||||
setup_memory();
|
||||
setup_resources();
|
||||
setup_lowcore();
|
||||
|
||||
cpu_init();
|
||||
__cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr;
|
||||
|
||||
|
@@ -244,7 +244,7 @@ int sysctl_hz_timer = 1;
|
||||
*/
|
||||
static inline void stop_hz_timer(void)
|
||||
{
|
||||
__u64 timer;
|
||||
__u64 timer, todval;
|
||||
|
||||
if (sysctl_hz_timer != 0)
|
||||
return;
|
||||
@@ -265,8 +265,14 @@ static inline void stop_hz_timer(void)
|
||||
* for the next event.
|
||||
*/
|
||||
timer = (__u64) (next_timer_interrupt() - jiffies) + jiffies_64;
|
||||
timer = jiffies_timer_cc + timer * CLK_TICKS_PER_JIFFY;
|
||||
asm volatile ("SCKC %0" : : "m" (timer));
|
||||
todval = -1ULL;
|
||||
/* Be careful about overflows. */
|
||||
if (timer < (-1ULL / CLK_TICKS_PER_JIFFY)) {
|
||||
timer = jiffies_timer_cc + timer * CLK_TICKS_PER_JIFFY;
|
||||
if (timer >= jiffies_timer_cc)
|
||||
todval = timer;
|
||||
}
|
||||
asm volatile ("SCKC %0" : : "m" (todval));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -122,12 +122,17 @@ static void start_cpu_timer(void)
|
||||
struct vtimer_queue *vt_list;
|
||||
|
||||
vt_list = &per_cpu(virt_cpu_timer, smp_processor_id());
|
||||
set_vtimer(vt_list->idle);
|
||||
|
||||
/* CPU timer interrupt is pending, don't reprogramm it */
|
||||
if (vt_list->idle & 1LL<<63)
|
||||
return;
|
||||
|
||||
if (!list_empty(&vt_list->list))
|
||||
set_vtimer(vt_list->idle);
|
||||
}
|
||||
|
||||
static void stop_cpu_timer(void)
|
||||
{
|
||||
__u64 done;
|
||||
struct vtimer_queue *vt_list;
|
||||
|
||||
vt_list = &per_cpu(virt_cpu_timer, smp_processor_id());
|
||||
@@ -138,21 +143,17 @@ static void stop_cpu_timer(void)
|
||||
goto fire;
|
||||
}
|
||||
|
||||
/* store progress */
|
||||
asm volatile ("STPT %0" : "=m" (done));
|
||||
/* store the actual expire value */
|
||||
asm volatile ("STPT %0" : "=m" (vt_list->idle));
|
||||
|
||||
/*
|
||||
* If done is negative we do not stop the CPU timer
|
||||
* because we will get instantly an interrupt that
|
||||
* will start the CPU timer again.
|
||||
* If the CPU timer is negative we don't reprogramm
|
||||
* it because we will get instantly an interrupt.
|
||||
*/
|
||||
if (done & 1LL<<63)
|
||||
if (vt_list->idle & 1LL<<63)
|
||||
return;
|
||||
else
|
||||
vt_list->offset += vt_list->to_expire - done;
|
||||
|
||||
/* save the actual expire value */
|
||||
vt_list->idle = done;
|
||||
vt_list->offset += vt_list->to_expire - vt_list->idle;
|
||||
|
||||
/*
|
||||
* We cannot halt the CPU timer, we just write a value that
|
||||
|
@@ -20,6 +20,11 @@
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
static char *sender = "VMRMSVM";
|
||||
module_param(sender, charp, 0);
|
||||
MODULE_PARM_DESC(sender,
|
||||
"Guest name that may send SMSG messages (default VMRMSVM)");
|
||||
|
||||
#include "../../../drivers/s390/net/smsgiucv.h"
|
||||
|
||||
#define CMM_NR_PAGES ((PAGE_SIZE / sizeof(unsigned long)) - 2)
|
||||
@@ -367,10 +372,12 @@ static struct ctl_table cmm_dir_table[] = {
|
||||
#ifdef CONFIG_CMM_IUCV
|
||||
#define SMSG_PREFIX "CMM"
|
||||
static void
|
||||
cmm_smsg_target(char *msg)
|
||||
cmm_smsg_target(char *from, char *msg)
|
||||
{
|
||||
long pages, seconds;
|
||||
|
||||
if (strlen(sender) > 0 && strcmp(from, sender) != 0)
|
||||
return;
|
||||
if (!cmm_skip_blanks(msg + strlen(SMSG_PREFIX), &msg))
|
||||
return;
|
||||
if (strncmp(msg, "SHRINK", 6) == 0) {
|
||||
|
@@ -101,6 +101,7 @@ extern unsigned long _end;
|
||||
extern unsigned long __init_begin;
|
||||
extern unsigned long __init_end;
|
||||
|
||||
extern unsigned long __initdata zholes_size[];
|
||||
/*
|
||||
* paging_init() sets up the page tables
|
||||
*/
|
||||
@@ -163,10 +164,13 @@ void __init paging_init(void)
|
||||
local_flush_tlb();
|
||||
|
||||
{
|
||||
unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0};
|
||||
unsigned long zones_size[MAX_NR_ZONES];
|
||||
|
||||
memset(zones_size, 0, sizeof(zones_size));
|
||||
zones_size[ZONE_DMA] = max_low_pfn;
|
||||
free_area_init(zones_size);
|
||||
free_area_init_node(0, &contig_page_data, zones_size,
|
||||
__pa(PAGE_OFFSET) >> PAGE_SHIFT,
|
||||
zholes_size);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -184,9 +188,10 @@ void __init paging_init(void)
|
||||
_KERN_REGION_TABLE;
|
||||
static const int ssm_mask = 0x04000000L;
|
||||
|
||||
unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
|
||||
unsigned long zones_size[MAX_NR_ZONES];
|
||||
unsigned long dma_pfn, high_pfn;
|
||||
|
||||
memset(zones_size, 0, sizeof(zones_size));
|
||||
dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT;
|
||||
high_pfn = max_low_pfn;
|
||||
|
||||
@@ -198,8 +203,8 @@ void __init paging_init(void)
|
||||
}
|
||||
|
||||
/* Initialize mem_map[]. */
|
||||
free_area_init(zones_size);
|
||||
|
||||
free_area_init_node(0, &contig_page_data, zones_size,
|
||||
__pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size);
|
||||
|
||||
/*
|
||||
* map whole physical memory to virtual memory (identity mapping)
|
||||
|
新しいイシューから参照
ユーザーをブロックする