You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: (44 commits) [S390] hypfs crashes with invalid mount option. [S390] cio: subchannel evaluation function operates without lock [S390] cio: always query all paths on path verification. [S390] cio: update path groups on logical CHPID changes. [S390] cio: subchannels in no-path state. [S390] Replace nopav-message on VM. [S390] set modalias for ccw bus uevents. [S390] Get rid of DBG macro. [S390] Use alternative user-copy operations for new hardware. [S390] Make user-copy operations run-time configurable. [S390] Cleanup in signal handling code. [S390] Cleanup in page table related code. [S390] Linux API for writing z/VM APPLDATA Monitor records. [S390] xpram off by one error. [S390] Remove kexec experimental flag. [S390] cleanup appldata. [S390] fix typo in vmcp. [S390] Kernel stack overflow handling. [S390] qdio slsb processing state. [S390] Missing initialization in common i/o layer. ...
This commit is contained in:
@@ -2452,6 +2452,8 @@ S: Maintained
|
||||
S390
|
||||
P: Martin Schwidefsky
|
||||
M: schwidefsky@de.ibm.com
|
||||
P: Heiko Carstens
|
||||
M: heiko.carstens@de.ibm.com
|
||||
M: linux390@de.ibm.com
|
||||
L: linux-390@vm.marist.edu
|
||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||
|
||||
+15
-2
@@ -460,8 +460,7 @@ config S390_HYPFS_FS
|
||||
information in an s390 hypervisor environment.
|
||||
|
||||
config KEXEC
|
||||
bool "kexec system call (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
bool "kexec system call"
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
@@ -487,8 +486,22 @@ source "drivers/net/Kconfig"
|
||||
|
||||
source "fs/Kconfig"
|
||||
|
||||
menu "Instrumentation Support"
|
||||
|
||||
source "arch/s390/oprofile/Kconfig"
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && MODULES
|
||||
help
|
||||
Kprobes allows you to trap at almost any kernel address and
|
||||
execute a callback function. register_kprobe() establishes
|
||||
a probepoint and specifies the callback. Kprobes is useful
|
||||
for kernel debugging, non-intrusive instrumentation and testing.
|
||||
If in doubt, say "N".
|
||||
|
||||
endmenu
|
||||
|
||||
source "arch/s390/Kconfig.debug"
|
||||
|
||||
source "security/Kconfig"
|
||||
|
||||
@@ -29,22 +29,6 @@
|
||||
#define CTL_APPLDATA_NET_SUM 2125
|
||||
#define CTL_APPLDATA_PROC 2126
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
|
||||
#define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */
|
||||
#define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */
|
||||
#define APPLDATA_GEN_EVENT_RECORD 0x02
|
||||
#define APPLDATA_START_CONFIG_REC 0x03
|
||||
|
||||
#else
|
||||
|
||||
#define APPLDATA_START_INTERVAL_REC 0x80
|
||||
#define APPLDATA_STOP_REC 0x81
|
||||
#define APPLDATA_GEN_EVENT_RECORD 0x82
|
||||
#define APPLDATA_START_CONFIG_REC 0x83
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
#define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x)
|
||||
#define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x)
|
||||
#define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x)
|
||||
|
||||
@@ -14,20 +14,20 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/page-flags.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <asm/timer.h>
|
||||
//#include <linux/kernel_stat.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <asm/appldata.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#include "appldata.h"
|
||||
|
||||
@@ -39,34 +39,6 @@
|
||||
|
||||
#define TOD_MICRO 0x01000 /* nr. of TOD clock units
|
||||
for 1 microsecond */
|
||||
|
||||
/*
|
||||
* Parameter list for DIAGNOSE X'DC'
|
||||
*/
|
||||
#ifndef CONFIG_64BIT
|
||||
struct appldata_parameter_list {
|
||||
u16 diag; /* The DIAGNOSE code X'00DC' */
|
||||
u8 function; /* The function code for the DIAGNOSE */
|
||||
u8 parlist_length; /* Length of the parameter list */
|
||||
u32 product_id_addr; /* Address of the 16-byte product ID */
|
||||
u16 reserved;
|
||||
u16 buffer_length; /* Length of the application data buffer */
|
||||
u32 buffer_addr; /* Address of the application data buffer */
|
||||
};
|
||||
#else
|
||||
struct appldata_parameter_list {
|
||||
u16 diag;
|
||||
u8 function;
|
||||
u8 parlist_length;
|
||||
u32 unused01;
|
||||
u16 reserved;
|
||||
u16 buffer_length;
|
||||
u32 unused02;
|
||||
u64 product_id_addr;
|
||||
u64 buffer_addr;
|
||||
};
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
/*
|
||||
* /proc entries (sysctl)
|
||||
*/
|
||||
@@ -181,46 +153,17 @@ static void appldata_work_fn(void *data)
|
||||
int appldata_diag(char record_nr, u16 function, unsigned long buffer,
|
||||
u16 length, char *mod_lvl)
|
||||
{
|
||||
unsigned long ry;
|
||||
struct appldata_product_id {
|
||||
char prod_nr[7]; /* product nr. */
|
||||
char prod_fn[2]; /* product function */
|
||||
char record_nr; /* record nr. */
|
||||
char version_nr[2]; /* version */
|
||||
char release_nr[2]; /* release */
|
||||
char mod_lvl[2]; /* modification lvl. */
|
||||
} appldata_product_id = {
|
||||
/* all strings are EBCDIC, record_nr is byte */
|
||||
struct appldata_product_id id = {
|
||||
.prod_nr = {0xD3, 0xC9, 0xD5, 0xE4,
|
||||
0xE7, 0xD2, 0xD9}, /* "LINUXKR" */
|
||||
.prod_fn = {0xD5, 0xD3}, /* "NL" */
|
||||
0xE7, 0xD2, 0xD9}, /* "LINUXKR" */
|
||||
.prod_fn = 0xD5D3, /* "NL" */
|
||||
.record_nr = record_nr,
|
||||
.version_nr = {0xF2, 0xF6}, /* "26" */
|
||||
.release_nr = {0xF0, 0xF1}, /* "01" */
|
||||
.mod_lvl = {mod_lvl[0], mod_lvl[1]},
|
||||
};
|
||||
struct appldata_parameter_list appldata_parameter_list = {
|
||||
.diag = 0xDC,
|
||||
.function = function,
|
||||
.parlist_length =
|
||||
sizeof(appldata_parameter_list),
|
||||
.buffer_length = length,
|
||||
.product_id_addr =
|
||||
(unsigned long) &appldata_product_id,
|
||||
.buffer_addr = virt_to_phys((void *) buffer)
|
||||
.version_nr = 0xF2F6, /* "26" */
|
||||
.release_nr = 0xF0F1, /* "01" */
|
||||
.mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1],
|
||||
};
|
||||
|
||||
if (!MACHINE_IS_VM)
|
||||
return -ENOSYS;
|
||||
ry = -1;
|
||||
asm volatile(
|
||||
"diag %1,%0,0xDC\n\t"
|
||||
: "=d" (ry)
|
||||
: "d" (&appldata_parameter_list),
|
||||
"m" (appldata_parameter_list),
|
||||
"m" (appldata_product_id)
|
||||
: "cc");
|
||||
return (int) ry;
|
||||
return appldata_asm(&id, function, (void *) buffer, length);
|
||||
}
|
||||
/************************ timer, work, DIAG <END> ****************************/
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/appldata.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#include "appldata.h"
|
||||
|
||||
@@ -428,6 +428,7 @@ CONFIG_S390_TAPE_34XX=m
|
||||
# CONFIG_VMLOGRDR is not set
|
||||
# CONFIG_VMCP is not set
|
||||
# CONFIG_MONREADER is not set
|
||||
CONFIG_MONWRITER=m
|
||||
|
||||
#
|
||||
# Cryptographic devices
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* fs/hypfs/hypfs.h
|
||||
* arch/s390/hypfs/hypfs.h
|
||||
* Hypervisor filesystem for Linux on s390.
|
||||
*
|
||||
* Copyright (C) IBM Corp. 2006
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* fs/hypfs/hypfs_diag.c
|
||||
* arch/s390/hypfs/hypfs_diag.c
|
||||
* Hypervisor filesystem for Linux on s390. Diag 204 and 224
|
||||
* implementation.
|
||||
*
|
||||
@@ -432,12 +432,14 @@ static int diag204_probe(void)
|
||||
|
||||
buf = diag204_get_buffer(INFO_EXT, &pages);
|
||||
if (!IS_ERR(buf)) {
|
||||
if (diag204(SUBC_STIB7 | INFO_EXT, pages, buf) >= 0) {
|
||||
if (diag204((unsigned long)SUBC_STIB7 |
|
||||
(unsigned long)INFO_EXT, pages, buf) >= 0) {
|
||||
diag204_store_sc = SUBC_STIB7;
|
||||
diag204_info_type = INFO_EXT;
|
||||
goto out;
|
||||
}
|
||||
if (diag204(SUBC_STIB6 | INFO_EXT, pages, buf) >= 0) {
|
||||
if (diag204((unsigned long)SUBC_STIB6 |
|
||||
(unsigned long)INFO_EXT, pages, buf) >= 0) {
|
||||
diag204_store_sc = SUBC_STIB7;
|
||||
diag204_info_type = INFO_EXT;
|
||||
goto out;
|
||||
@@ -452,7 +454,8 @@ static int diag204_probe(void)
|
||||
rc = PTR_ERR(buf);
|
||||
goto fail_alloc;
|
||||
}
|
||||
if (diag204(SUBC_STIB4 | INFO_SIMPLE, pages, buf) >= 0) {
|
||||
if (diag204((unsigned long)SUBC_STIB4 |
|
||||
(unsigned long)INFO_SIMPLE, pages, buf) >= 0) {
|
||||
diag204_store_sc = SUBC_STIB4;
|
||||
diag204_info_type = INFO_SIMPLE;
|
||||
goto out;
|
||||
@@ -476,7 +479,8 @@ static void *diag204_store(void)
|
||||
buf = diag204_get_buffer(diag204_info_type, &pages);
|
||||
if (IS_ERR(buf))
|
||||
goto out;
|
||||
if (diag204(diag204_store_sc | diag204_info_type, pages, buf) < 0)
|
||||
if (diag204((unsigned long)diag204_store_sc |
|
||||
(unsigned long)diag204_info_type, pages, buf) < 0)
|
||||
return ERR_PTR(-ENOSYS);
|
||||
out:
|
||||
return buf;
|
||||
@@ -531,7 +535,7 @@ __init int hypfs_diag_init(void)
|
||||
return rc;
|
||||
}
|
||||
|
||||
__exit void hypfs_diag_exit(void)
|
||||
void hypfs_diag_exit(void)
|
||||
{
|
||||
diag224_delete_name_table();
|
||||
diag204_free_buffer();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* fs/hypfs/hypfs_diag.h
|
||||
* arch/s390/hypfs_diag.h
|
||||
* Hypervisor filesystem for Linux on s390.
|
||||
*
|
||||
* Copyright (C) IBM Corp. 2006
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* fs/hypfs/inode.c
|
||||
* arch/s390/hypfs/inode.c
|
||||
* Hypervisor filesystem for Linux on s390.
|
||||
*
|
||||
* Copyright (C) IBM Corp. 2006
|
||||
@@ -312,10 +312,12 @@ static void hypfs_kill_super(struct super_block *sb)
|
||||
{
|
||||
struct hypfs_sb_info *sb_info = sb->s_fs_info;
|
||||
|
||||
hypfs_delete_tree(sb->s_root);
|
||||
hypfs_remove(sb_info->update_file);
|
||||
kfree(sb->s_fs_info);
|
||||
sb->s_fs_info = NULL;
|
||||
if (sb->s_root) {
|
||||
hypfs_delete_tree(sb->s_root);
|
||||
hypfs_remove(sb_info->update_file);
|
||||
kfree(sb->s_fs_info);
|
||||
sb->s_fs_info = NULL;
|
||||
}
|
||||
kill_litter_super(sb);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional
|
||||
|
||||
obj-y := bitmap.o traps.o time.o process.o \
|
||||
setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
|
||||
semaphore.o s390_ext.o debug.o profile.o irq.o reipl_diag.o
|
||||
semaphore.o s390_ext.o debug.o profile.o irq.o ipl.o
|
||||
|
||||
obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o)
|
||||
obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
|
||||
@@ -24,6 +24,7 @@ obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o \
|
||||
|
||||
obj-$(CONFIG_VIRT_TIMER) += vtime.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
||||
# Kexec part
|
||||
S390_KEXEC_OBJS := machine_kexec.o crash.o
|
||||
|
||||
@@ -505,6 +505,8 @@ pgm_no_vtime2:
|
||||
mvc __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS
|
||||
mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
|
||||
oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
|
||||
tm SP_PSW+1(%r15),0x01 # kernel per event ?
|
||||
bz BASED(kernel_per)
|
||||
l %r3,__LC_PGM_ILC # load program interruption code
|
||||
la %r8,0x7f
|
||||
nr %r8,%r3 # clear per-event-bit and ilc
|
||||
@@ -536,6 +538,16 @@ pgm_no_vtime3:
|
||||
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
||||
b BASED(sysc_do_svc)
|
||||
|
||||
#
|
||||
# per was called from kernel, must be kprobes
|
||||
#
|
||||
kernel_per:
|
||||
mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check
|
||||
la %r2,SP_PTREGS(%r15) # address of register-save area
|
||||
l %r1,BASED(.Lhandle_per) # load adr. of per handler
|
||||
la %r14,BASED(sysc_leave) # load adr. of system return
|
||||
br %r1 # branch to do_single_step
|
||||
|
||||
/*
|
||||
* IO interrupt handler routine
|
||||
*/
|
||||
|
||||
@@ -518,6 +518,8 @@ pgm_no_vtime2:
|
||||
#endif
|
||||
lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct
|
||||
lg %r1,__TI_task(%r9)
|
||||
tm SP_PSW+1(%r15),0x01 # kernel per event ?
|
||||
jz kernel_per
|
||||
mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID
|
||||
mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS
|
||||
mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID
|
||||
@@ -553,6 +555,16 @@ pgm_no_vtime3:
|
||||
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
||||
j sysc_do_svc
|
||||
|
||||
#
|
||||
# per was called from kernel, must be kprobes
|
||||
#
|
||||
kernel_per:
|
||||
lhi %r0,__LC_PGM_OLD_PSW
|
||||
sth %r0,SP_TRAP(%r15) # set trap indication to pgm check
|
||||
la %r2,SP_PTREGS(%r15) # address of register-save area
|
||||
larl %r14,sysc_leave # load adr. of system ret, no work
|
||||
jg do_single_step # branch to do_single_step
|
||||
|
||||
/*
|
||||
* IO interrupt handler routine
|
||||
*/
|
||||
@@ -815,7 +827,7 @@ restart_go:
|
||||
*/
|
||||
stack_overflow:
|
||||
lg %r15,__LC_PANIC_STACK # change to panic stack
|
||||
aghi %r1,-SP_SIZE
|
||||
aghi %r15,-SP_SIZE
|
||||
mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack
|
||||
stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack
|
||||
la %r1,__LC_SAVE_AREA
|
||||
@@ -823,7 +835,7 @@ stack_overflow:
|
||||
je 0f
|
||||
chi %r12,__LC_PGM_OLD_PSW
|
||||
je 0f
|
||||
la %r1,__LC_SAVE_AREA+16
|
||||
la %r1,__LC_SAVE_AREA+32
|
||||
0: mvc SP_R12(32,%r15),0(%r1) # move %r12-%r15 to stack
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) # clear back chain
|
||||
la %r2,SP_PTREGS(%r15) # load pt_regs
|
||||
|
||||
+6
-63
@@ -272,7 +272,7 @@ iplstart:
|
||||
# load parameter file from ipl device
|
||||
#
|
||||
.Lagain1:
|
||||
l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # ramdisk loc. is temp
|
||||
l %r2,.Linitrd # ramdisk loc. is temp
|
||||
bas %r14,.Lloader # load parameter file
|
||||
ltr %r2,%r2 # got anything ?
|
||||
bz .Lnopf
|
||||
@@ -280,7 +280,7 @@ iplstart:
|
||||
bnh .Lnotrunc
|
||||
la %r2,895
|
||||
.Lnotrunc:
|
||||
l %r4,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
|
||||
l %r4,.Linitrd
|
||||
clc 0(3,%r4),.L_hdr # if it is HDRx
|
||||
bz .Lagain1 # skip dataset header
|
||||
clc 0(3,%r4),.L_eof # if it is EOFx
|
||||
@@ -323,14 +323,15 @@ iplstart:
|
||||
# load ramdisk from ipl device
|
||||
#
|
||||
.Lagain2:
|
||||
l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # addr of ramdisk
|
||||
l %r2,.Linitrd # addr of ramdisk
|
||||
st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
|
||||
bas %r14,.Lloader # load ramdisk
|
||||
st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of ramdisk
|
||||
ltr %r2,%r2
|
||||
bnz .Lrdcont
|
||||
st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
|
||||
.Lrdcont:
|
||||
l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
|
||||
l %r2,.Linitrd
|
||||
|
||||
clc 0(3,%r2),.L_hdr # skip HDRx and EOFx
|
||||
bz .Lagain2
|
||||
@@ -379,6 +380,7 @@ iplstart:
|
||||
l %r1,.Lstartup
|
||||
br %r1
|
||||
|
||||
.Linitrd:.long _end + 0x400000 # default address of initrd
|
||||
.Lparm: .long PARMAREA
|
||||
.Lstartup: .long startup
|
||||
.Lcvtab:.long _ebcasc # ebcdic to ascii table
|
||||
@@ -479,65 +481,6 @@ start:
|
||||
.byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
|
||||
.byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
|
||||
|
||||
.macro GET_IPL_DEVICE
|
||||
.Lget_ipl_device:
|
||||
l %r1,0xb8 # get sid
|
||||
sll %r1,15 # test if subchannel is enabled
|
||||
srl %r1,31
|
||||
ltr %r1,%r1
|
||||
bz 2f-.LPG1(%r13) # subchannel disabled
|
||||
l %r1,0xb8
|
||||
la %r5,.Lipl_schib-.LPG1(%r13)
|
||||
stsch 0(%r5) # get schib of subchannel
|
||||
bnz 2f-.LPG1(%r13) # schib not available
|
||||
tm 5(%r5),0x01 # devno valid?
|
||||
bno 2f-.LPG1(%r13)
|
||||
la %r6,ipl_parameter_flags-.LPG1(%r13)
|
||||
oi 3(%r6),0x01 # set flag
|
||||
la %r2,ipl_devno-.LPG1(%r13)
|
||||
mvc 0(2,%r2),6(%r5) # store devno
|
||||
tm 4(%r5),0x80 # qdio capable device?
|
||||
bno 2f-.LPG1(%r13)
|
||||
oi 3(%r6),0x02 # set flag
|
||||
|
||||
# copy ipl parameters
|
||||
|
||||
lhi %r0,4096
|
||||
l %r2,20(%r0) # get address of parameter list
|
||||
lhi %r3,IPL_PARMBLOCK_ORIGIN
|
||||
st %r3,20(%r0)
|
||||
lhi %r4,1
|
||||
cr %r2,%r3 # start parameters < destination ?
|
||||
jl 0f
|
||||
lhi %r1,1 # copy direction is upwards
|
||||
j 1f
|
||||
0: lhi %r1,-1 # copy direction is downwards
|
||||
ar %r2,%r0
|
||||
ar %r3,%r0
|
||||
ar %r2,%r1
|
||||
ar %r3,%r1
|
||||
1: mvc 0(1,%r3),0(%r2) # finally copy ipl parameters
|
||||
ar %r3,%r1
|
||||
ar %r2,%r1
|
||||
sr %r0,%r4
|
||||
jne 1b
|
||||
b 2f-.LPG1(%r13)
|
||||
|
||||
.align 4
|
||||
.Lipl_schib:
|
||||
.rept 13
|
||||
.long 0
|
||||
.endr
|
||||
|
||||
.globl ipl_parameter_flags
|
||||
ipl_parameter_flags:
|
||||
.long 0
|
||||
.globl ipl_devno
|
||||
ipl_devno:
|
||||
.word 0
|
||||
2:
|
||||
.endm
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#include "head64.S"
|
||||
#else
|
||||
|
||||
+34
-14
@@ -26,8 +26,8 @@ startup:basr %r13,0 # get base
|
||||
#
|
||||
.org PARMAREA
|
||||
.long 0,0 # IPL_DEVICE
|
||||
.long 0,RAMDISK_ORIGIN # INITRD_START
|
||||
.long 0,RAMDISK_SIZE # INITRD_SIZE
|
||||
.long 0,0 # INITRD_START
|
||||
.long 0,0 # INITRD_SIZE
|
||||
|
||||
.org COMMAND_LINE
|
||||
.byte "root=/dev/ram0 ro"
|
||||
@@ -37,12 +37,23 @@ startup:basr %r13,0 # get base
|
||||
|
||||
startup_continue:
|
||||
basr %r13,0 # get base
|
||||
.LPG1: GET_IPL_DEVICE
|
||||
.LPG1: mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0)
|
||||
lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
|
||||
l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
|
||||
# move IPL device to lowcore
|
||||
mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12)
|
||||
#
|
||||
# Setup stack
|
||||
#
|
||||
l %r15,.Linittu-.LPG1(%r13)
|
||||
mvc __LC_CURRENT(4),__TI_task(%r15)
|
||||
ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE
|
||||
st %r15,__LC_KERNEL_STACK # set end of kernel stack
|
||||
ahi %r15,-96
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain
|
||||
|
||||
l %r14,.Lipl_save_parameters-.LPG1(%r13)
|
||||
basr %r14,%r14
|
||||
#
|
||||
# clear bss memory
|
||||
#
|
||||
@@ -114,6 +125,10 @@ startup_continue:
|
||||
b .Lfchunk-.LPG1(%r13)
|
||||
|
||||
.align 4
|
||||
.Lipl_save_parameters:
|
||||
.long ipl_save_parameters
|
||||
.Linittu:
|
||||
.long init_thread_union
|
||||
.Lpmask:
|
||||
.byte 0
|
||||
.align 8
|
||||
@@ -273,7 +288,23 @@ startup_continue:
|
||||
.Lbss_end: .long _end
|
||||
.Lparmaddr: .long PARMAREA
|
||||
.Lsccbaddr: .long .Lsccb
|
||||
|
||||
.globl ipl_schib
|
||||
ipl_schib:
|
||||
.rept 13
|
||||
.long 0
|
||||
.endr
|
||||
|
||||
.globl ipl_flags
|
||||
ipl_flags:
|
||||
.long 0
|
||||
.globl ipl_devno
|
||||
ipl_devno:
|
||||
.word 0
|
||||
|
||||
.org 0x12000
|
||||
.globl s390_readinfo_sccb
|
||||
s390_readinfo_sccb:
|
||||
.Lsccb:
|
||||
.hword 0x1000 # length, one page
|
||||
.byte 0x00,0x00,0x00
|
||||
@@ -302,16 +333,6 @@ startup_continue:
|
||||
.globl _stext
|
||||
_stext: basr %r13,0 # get base
|
||||
.LPG3:
|
||||
#
|
||||
# Setup stack
|
||||
#
|
||||
l %r15,.Linittu-.LPG3(%r13)
|
||||
mvc __LC_CURRENT(4),__TI_task(%r15)
|
||||
ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE
|
||||
st %r15,__LC_KERNEL_STACK # set end of kernel stack
|
||||
ahi %r15,-96
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain
|
||||
|
||||
# check control registers
|
||||
stctl %c0,%c15,0(%r15)
|
||||
oi 2(%r15),0x40 # enable sigp emergency signal
|
||||
@@ -330,6 +351,5 @@ _stext: basr %r13,0 # get base
|
||||
#
|
||||
.align 8
|
||||
.Ldw: .long 0x000a0000,0x00000000
|
||||
.Linittu:.long init_thread_union
|
||||
.Lstart:.long start_kernel
|
||||
.Laregs:.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
+43
-16
@@ -26,8 +26,8 @@ startup:basr %r13,0 # get base
|
||||
#
|
||||
.org PARMAREA
|
||||
.quad 0 # IPL_DEVICE
|
||||
.quad RAMDISK_ORIGIN # INITRD_START
|
||||
.quad RAMDISK_SIZE # INITRD_SIZE
|
||||
.quad 0 # INITRD_START
|
||||
.quad 0 # INITRD_SIZE
|
||||
|
||||
.org COMMAND_LINE
|
||||
.byte "root=/dev/ram0 ro"
|
||||
@@ -39,8 +39,8 @@ startup_continue:
|
||||
basr %r13,0 # get base
|
||||
.LPG1: sll %r13,1 # remove high order bit
|
||||
srl %r13,1
|
||||
GET_IPL_DEVICE
|
||||
lhi %r1,1 # mode 1 = esame
|
||||
mvi __LC_AR_MODE_ID,1 # set esame flag
|
||||
slr %r0,%r0 # set cpuid to zero
|
||||
sigp %r1,%r0,0x12 # switch to esame mode
|
||||
sam64 # switch to 64 bit mode
|
||||
@@ -48,7 +48,18 @@ startup_continue:
|
||||
lg %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area
|
||||
# move IPL device to lowcore
|
||||
mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
|
||||
#
|
||||
# Setup stack
|
||||
#
|
||||
larl %r15,init_thread_union
|
||||
lg %r14,__TI_task(%r15) # cache current in lowcore
|
||||
stg %r14,__LC_CURRENT
|
||||
aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE
|
||||
stg %r15,__LC_KERNEL_STACK # set end of kernel stack
|
||||
aghi %r15,-160
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain
|
||||
|
||||
brasl %r14,ipl_save_parameters
|
||||
#
|
||||
# clear bss memory
|
||||
#
|
||||
@@ -239,6 +250,19 @@ startup_continue:
|
||||
oi 7(%r12),0x80 # set IDTE flag
|
||||
0:
|
||||
|
||||
#
|
||||
# find out if we have the MVCOS instruction
|
||||
#
|
||||
la %r1,0f-.LPG1(%r13) # set program check address
|
||||
stg %r1,__LC_PGM_NEW_PSW+8
|
||||
.short 0xc800 # mvcos 0(%r0),0(%r0),%r0
|
||||
.short 0x0000
|
||||
.short 0x0000
|
||||
0: tm 0x8f,0x13 # special-operation exception?
|
||||
bno 1f-.LPG1(%r13) # if yes, MVCOS is present
|
||||
oi 6(%r12),2 # set MVCOS flag
|
||||
1:
|
||||
|
||||
lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space,
|
||||
# virtual and never return ...
|
||||
.align 16
|
||||
@@ -268,7 +292,22 @@ startup_continue:
|
||||
.Lparmaddr:
|
||||
.quad PARMAREA
|
||||
|
||||
.globl ipl_schib
|
||||
ipl_schib:
|
||||
.rept 13
|
||||
.long 0
|
||||
.endr
|
||||
|
||||
.globl ipl_flags
|
||||
ipl_flags:
|
||||
.long 0
|
||||
.globl ipl_devno
|
||||
ipl_devno:
|
||||
.word 0
|
||||
|
||||
.org 0x12000
|
||||
.globl s390_readinfo_sccb
|
||||
s390_readinfo_sccb:
|
||||
.Lsccb:
|
||||
.hword 0x1000 # length, one page
|
||||
.byte 0x00,0x00,0x00
|
||||
@@ -297,24 +336,12 @@ startup_continue:
|
||||
.globl _stext
|
||||
_stext: basr %r13,0 # get base
|
||||
.LPG3:
|
||||
#
|
||||
# Setup stack
|
||||
#
|
||||
larl %r15,init_thread_union
|
||||
lg %r14,__TI_task(%r15) # cache current in lowcore
|
||||
stg %r14,__LC_CURRENT
|
||||
aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE
|
||||
stg %r15,__LC_KERNEL_STACK # set end of kernel stack
|
||||
aghi %r15,-160
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain
|
||||
|
||||
# check control registers
|
||||
stctg %c0,%c15,0(%r15)
|
||||
oi 6(%r15),0x40 # enable sigp emergency signal
|
||||
oi 4(%r15),0x10 # switch on low address proctection
|
||||
lctlg %c0,%c15,0(%r15)
|
||||
|
||||
#
|
||||
lam 0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess
|
||||
brasl %r14,start_kernel # go to C code
|
||||
#
|
||||
@@ -322,7 +349,7 @@ _stext: basr %r13,0 # get base
|
||||
#
|
||||
basr %r13,0
|
||||
lpswe .Ldw-.(%r13) # load disabled wait psw
|
||||
#
|
||||
|
||||
.align 8
|
||||
.Ldw: .quad 0x0002000180000000,0x0000000000000000
|
||||
.Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,30 @@
|
||||
|
||||
#include <asm/lowcore.h>
|
||||
|
||||
.globl do_reipl
|
||||
do_reipl: basr %r13,0
|
||||
.globl do_reipl_asm
|
||||
do_reipl_asm: basr %r13,0
|
||||
.Lpg0: lpsw .Lnewpsw-.Lpg0(%r13)
|
||||
.Lpg1: lctl %c6,%c6,.Lall-.Lpg0(%r13)
|
||||
stctl %c0,%c0,.Lctlsave-.Lpg0(%r13)
|
||||
ni .Lctlsave-.Lpg0(%r13),0xef
|
||||
lctl %c0,%c0,.Lctlsave-.Lpg0(%r13)
|
||||
|
||||
# switch off lowcore protection
|
||||
|
||||
.Lpg1: stctl %c0,%c0,.Lctlsave1-.Lpg0(%r13)
|
||||
stctl %c0,%c0,.Lctlsave2-.Lpg0(%r13)
|
||||
ni .Lctlsave1-.Lpg0(%r13),0xef
|
||||
lctl %c0,%c0,.Lctlsave1-.Lpg0(%r13)
|
||||
|
||||
# do store status of all registers
|
||||
|
||||
stm %r0,%r15,__LC_GPREGS_SAVE_AREA
|
||||
stctl %c0,%c15,__LC_CREGS_SAVE_AREA
|
||||
mvc __LC_CREGS_SAVE_AREA(4),.Lctlsave2-.Lpg0(%r13)
|
||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA
|
||||
stpx __LC_PREFIX_SAVE_AREA
|
||||
stckc .Lclkcmp-.Lpg0(%r13)
|
||||
mvc __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13)
|
||||
stpt __LC_CPU_TIMER_SAVE_AREA
|
||||
st %r13, __LC_PSW_SAVE_AREA+4
|
||||
|
||||
lctl %c6,%c6,.Lall-.Lpg0(%r13)
|
||||
lr %r1,%r2
|
||||
mvc __LC_PGM_NEW_PSW(8),.Lpcnew-.Lpg0(%r13)
|
||||
stsch .Lschib-.Lpg0(%r13)
|
||||
@@ -46,9 +63,11 @@ do_reipl: basr %r13,0
|
||||
.Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13)
|
||||
lpsw .Ldispsw-.Lpg0(%r13)
|
||||
.align 8
|
||||
.Lclkcmp: .quad 0x0000000000000000
|
||||
.Lall: .long 0xff000000
|
||||
.Lnull: .long 0x00000000
|
||||
.Lctlsave: .long 0x00000000
|
||||
.Lctlsave1: .long 0x00000000
|
||||
.Lctlsave2: .long 0x00000000
|
||||
.align 8
|
||||
.Lnewpsw: .long 0x00080000,0x80000000+.Lpg1
|
||||
.Lpcnew: .long 0x00080000,0x80000000+.Lecs
|
||||
|
||||
@@ -8,13 +8,30 @@
|
||||
*/
|
||||
|
||||
#include <asm/lowcore.h>
|
||||
.globl do_reipl
|
||||
do_reipl: basr %r13,0
|
||||
.Lpg0: lpswe .Lnewpsw-.Lpg0(%r13)
|
||||
.globl do_reipl_asm
|
||||
do_reipl_asm: basr %r13,0
|
||||
|
||||
# do store status of all registers
|
||||
|
||||
.Lpg0: stg %r1,.Lregsave-.Lpg0(%r13)
|
||||
lghi %r1,0x1000
|
||||
stmg %r0,%r15,__LC_GPREGS_SAVE_AREA-0x1000(%r1)
|
||||
lg %r0,.Lregsave-.Lpg0(%r13)
|
||||
stg %r0,__LC_GPREGS_SAVE_AREA-0x1000+8(%r1)
|
||||
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-0x1000(%r1)
|
||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA-0x1000(%r1)
|
||||
stpx __LC_PREFIX_SAVE_AREA-0x1000(%r1)
|
||||
stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1)
|
||||
stckc .Lclkcmp-.Lpg0(%r13)
|
||||
mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13)
|
||||
stpt __LC_CPU_TIMER_SAVE_AREA-0x1000(%r1)
|
||||
stg %r13, __LC_PSW_SAVE_AREA-0x1000+8(%r1)
|
||||
|
||||
lpswe .Lnewpsw-.Lpg0(%r13)
|
||||
.Lpg1: lctlg %c6,%c6,.Lall-.Lpg0(%r13)
|
||||
stctg %c0,%c0,.Lctlsave-.Lpg0(%r13)
|
||||
ni .Lctlsave+4-.Lpg0(%r13),0xef
|
||||
lctlg %c0,%c0,.Lctlsave-.Lpg0(%r13)
|
||||
stctg %c0,%c0,.Lregsave-.Lpg0(%r13)
|
||||
ni .Lregsave+4-.Lpg0(%r13),0xef
|
||||
lctlg %c0,%c0,.Lregsave-.Lpg0(%r13)
|
||||
lgr %r1,%r2
|
||||
mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)
|
||||
stsch .Lschib-.Lpg0(%r13)
|
||||
@@ -50,8 +67,9 @@ do_reipl: basr %r13,0
|
||||
st %r14,.Ldispsw+12-.Lpg0(%r13)
|
||||
lpswe .Ldispsw-.Lpg0(%r13)
|
||||
.align 8
|
||||
.Lclkcmp: .quad 0x0000000000000000
|
||||
.Lall: .quad 0x00000000ff000000
|
||||
.Lctlsave: .quad 0x0000000000000000
|
||||
.Lregsave: .quad 0x0000000000000000
|
||||
.Lnull: .long 0x0000000000000000
|
||||
.align 16
|
||||
/*
|
||||
@@ -92,5 +110,3 @@ do_reipl: basr %r13,0
|
||||
.long 0x00000000,0x00000000
|
||||
.long 0x00000000,0x00000000
|
||||
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user