Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 update from Martin Schwidefsky: "The most prominent change in this patch set is the software dirty bit patch for s390. It removes __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY and the page_test_and_clear_dirty primitive which makes the common memory management code a bit less obscure. Heiko fixed most of the PCI related fallout, more often than not missing GENERIC_HARDIRQS dependencies. Notable is one of the 3270 patches which adds an export to tty_io to be able to resize a tty. The rest is the usual bunch of cleanups and bug fixes." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (42 commits) s390/module: Add missing R_390_NONE relocation type drivers/gpio: add missing GENERIC_HARDIRQ dependency drivers/input: add couple of missing GENERIC_HARDIRQS dependencies s390/cleanup: rename SPP to LPP s390/mm: implement software dirty bits s390/mm: Fix crst upgrade of mmap with MAP_FIXED s390/linker skript: discard exit.data at runtime drivers/media: add missing GENERIC_HARDIRQS dependency s390/bpf,jit: add vlan tag support drivers/net,AT91RM9200: add missing GENERIC_HARDIRQS dependency iucv: fix kernel panic at reboot s390/Kconfig: sort list of arch selected config options phylib: remove !S390 dependeny from Kconfig uio: remove !S390 dependency from Kconfig dasd: fix sysfs cleanup in dasd_generic_remove s390/pci: fix hotplug module init s390/pci: cleanup clp page allocation s390/pci: cleanup clp inline assembly s390/perf: cpum_cf: fallback to software sampling events s390/mm: provide PAGE_SHARED define ...
This commit is contained in:
@@ -867,7 +867,7 @@ static inline void
|
||||
debug_finish_entry(debug_info_t * id, debug_entry_t* active, int level,
|
||||
int exception)
|
||||
{
|
||||
active->id.stck = get_clock();
|
||||
active->id.stck = get_tod_clock();
|
||||
active->id.fields.cpuid = smp_processor_id();
|
||||
active->caller = __builtin_return_address(0);
|
||||
active->id.fields.exception = exception;
|
||||
|
@@ -840,7 +840,6 @@ static struct insn opcode_b2[] = {
|
||||
{ "stcke", 0x78, INSTR_S_RD },
|
||||
{ "sacf", 0x79, INSTR_S_RD },
|
||||
{ "stsi", 0x7d, INSTR_S_RD },
|
||||
{ "spp", 0x80, INSTR_S_RD },
|
||||
{ "srnm", 0x99, INSTR_S_RD },
|
||||
{ "stfpc", 0x9c, INSTR_S_RD },
|
||||
{ "lfpc", 0x9d, INSTR_S_RD },
|
||||
|
@@ -47,10 +47,10 @@ static void __init reset_tod_clock(void)
|
||||
{
|
||||
u64 time;
|
||||
|
||||
if (store_clock(&time) == 0)
|
||||
if (store_tod_clock(&time) == 0)
|
||||
return;
|
||||
/* TOD clock not running. Set the clock to Unix Epoch. */
|
||||
if (set_clock(TOD_UNIX_EPOCH) != 0 || store_clock(&time) != 0)
|
||||
if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0)
|
||||
disabled_wait(0);
|
||||
|
||||
sched_clock_base_cc = TOD_UNIX_EPOCH;
|
||||
@@ -173,7 +173,7 @@ static noinline __init void create_kernel_nss(void)
|
||||
}
|
||||
|
||||
/* re-initialize cputime accounting. */
|
||||
sched_clock_base_cc = get_clock();
|
||||
sched_clock_base_cc = get_tod_clock();
|
||||
S390_lowcore.last_update_clock = sched_clock_base_cc;
|
||||
S390_lowcore.last_update_timer = 0x7fffffffffffffffULL;
|
||||
S390_lowcore.user_timer = 0;
|
||||
@@ -381,7 +381,7 @@ static __init void detect_machine_facilities(void)
|
||||
if (test_facility(27))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_MVCOS;
|
||||
if (test_facility(40))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_SPP;
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_LPP;
|
||||
if (test_facility(50) && test_facility(73))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_TE;
|
||||
if (test_facility(66))
|
||||
|
@@ -72,9 +72,9 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro SPP newpp
|
||||
.macro LPP newpp
|
||||
#if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE)
|
||||
tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_SPP
|
||||
tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_LPP
|
||||
jz .+8
|
||||
.insn s,0xb2800000,\newpp
|
||||
#endif
|
||||
@@ -96,7 +96,7 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
|
||||
jhe .+22
|
||||
.endif
|
||||
lg %r9,BASED(.Lsie_loop)
|
||||
SPP BASED(.Lhost_id) # set host id
|
||||
LPP BASED(.Lhost_id) # set host id
|
||||
#endif
|
||||
.endm
|
||||
|
||||
@@ -967,10 +967,10 @@ sie_loop:
|
||||
lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce
|
||||
sie_gmap:
|
||||
lg %r14,__SF_EMPTY(%r15) # get control block pointer
|
||||
SPP __SF_EMPTY(%r15) # set guest id
|
||||
LPP __SF_EMPTY(%r15) # set guest id
|
||||
sie 0(%r14)
|
||||
sie_done:
|
||||
SPP __SF_EMPTY+16(%r15) # set host id
|
||||
LPP __SF_EMPTY+16(%r15) # set host id
|
||||
lg %r14,__LC_THREAD_INFO # pointer thread_info struct
|
||||
sie_exit:
|
||||
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
||||
|
@@ -1414,6 +1414,16 @@ static struct kobj_attribute dump_type_attr =
|
||||
|
||||
static struct kset *dump_kset;
|
||||
|
||||
static void diag308_dump(void *dump_block)
|
||||
{
|
||||
diag308(DIAG308_SET, dump_block);
|
||||
while (1) {
|
||||
if (diag308(DIAG308_DUMP, NULL) != 0x302)
|
||||
break;
|
||||
udelay_simple(USEC_PER_SEC);
|
||||
}
|
||||
}
|
||||
|
||||
static void __dump_run(void *unused)
|
||||
{
|
||||
struct ccw_dev_id devid;
|
||||
@@ -1432,12 +1442,10 @@ static void __dump_run(void *unused)
|
||||
__cpcmd(buf, NULL, 0, NULL);
|
||||
break;
|
||||
case DUMP_METHOD_CCW_DIAG:
|
||||
diag308(DIAG308_SET, dump_block_ccw);
|
||||
diag308(DIAG308_DUMP, NULL);
|
||||
diag308_dump(dump_block_ccw);
|
||||
break;
|
||||
case DUMP_METHOD_FCP_DIAG:
|
||||
diag308(DIAG308_SET, dump_block_fcp);
|
||||
diag308(DIAG308_DUMP, NULL);
|
||||
diag308_dump(dump_block_fcp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@@ -65,8 +65,7 @@ void module_free(struct module *mod, void *module_region)
|
||||
vfree(module_region);
|
||||
}
|
||||
|
||||
static void
|
||||
check_rela(Elf_Rela *rela, struct module *me)
|
||||
static void check_rela(Elf_Rela *rela, struct module *me)
|
||||
{
|
||||
struct mod_arch_syminfo *info;
|
||||
|
||||
@@ -115,9 +114,8 @@ check_rela(Elf_Rela *rela, struct module *me)
|
||||
* Account for GOT and PLT relocations. We can't add sections for
|
||||
* got and plt but we can increase the core module size.
|
||||
*/
|
||||
int
|
||||
module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
char *secstrings, struct module *me)
|
||||
int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
char *secstrings, struct module *me)
|
||||
{
|
||||
Elf_Shdr *symtab;
|
||||
Elf_Sym *symbols;
|
||||
@@ -179,13 +177,52 @@ module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
struct module *me)
|
||||
static int apply_rela_bits(Elf_Addr loc, Elf_Addr val,
|
||||
int sign, int bits, int shift)
|
||||
{
|
||||
unsigned long umax;
|
||||
long min, max;
|
||||
|
||||
if (val & ((1UL << shift) - 1))
|
||||
return -ENOEXEC;
|
||||
if (sign) {
|
||||
val = (Elf_Addr)(((long) val) >> shift);
|
||||
min = -(1L << (bits - 1));
|
||||
max = (1L << (bits - 1)) - 1;
|
||||
if ((long) val < min || (long) val > max)
|
||||
return -ENOEXEC;
|
||||
} else {
|
||||
val >>= shift;
|
||||
umax = ((1UL << (bits - 1)) << 1) - 1;
|
||||
if ((unsigned long) val > umax)
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (bits == 8)
|
||||
*(unsigned char *) loc = val;
|
||||
else if (bits == 12)
|
||||
*(unsigned short *) loc = (val & 0xfff) |
|
||||
(*(unsigned short *) loc & 0xf000);
|
||||
else if (bits == 16)
|
||||
*(unsigned short *) loc = val;
|
||||
else if (bits == 20)
|
||||
*(unsigned int *) loc = (val & 0xfff) << 16 |
|
||||
(val & 0xff000) >> 4 |
|
||||
(*(unsigned int *) loc & 0xf00000ff);
|
||||
else if (bits == 32)
|
||||
*(unsigned int *) loc = val;
|
||||
else if (bits == 64)
|
||||
*(unsigned long *) loc = val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
const char *strtab, struct module *me)
|
||||
{
|
||||
struct mod_arch_syminfo *info;
|
||||
Elf_Addr loc, val;
|
||||
int r_type, r_sym;
|
||||
int rc;
|
||||
|
||||
/* This is where to make the change */
|
||||
loc = base + rela->r_offset;
|
||||
@@ -197,6 +234,9 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
val = symtab[r_sym].st_value;
|
||||
|
||||
switch (r_type) {
|
||||
case R_390_NONE: /* No relocation. */
|
||||
rc = 0;
|
||||
break;
|
||||
case R_390_8: /* Direct 8 bit. */
|
||||
case R_390_12: /* Direct 12 bit. */
|
||||
case R_390_16: /* Direct 16 bit. */
|
||||
@@ -205,20 +245,17 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
case R_390_64: /* Direct 64 bit. */
|
||||
val += rela->r_addend;
|
||||
if (r_type == R_390_8)
|
||||
*(unsigned char *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 8, 0);
|
||||
else if (r_type == R_390_12)
|
||||
*(unsigned short *) loc = (val & 0xfff) |
|
||||
(*(unsigned short *) loc & 0xf000);
|
||||
rc = apply_rela_bits(loc, val, 0, 12, 0);
|
||||
else if (r_type == R_390_16)
|
||||
*(unsigned short *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 16, 0);
|
||||
else if (r_type == R_390_20)
|
||||
*(unsigned int *) loc =
|
||||
(*(unsigned int *) loc & 0xf00000ff) |
|
||||
(val & 0xfff) << 16 | (val & 0xff000) >> 4;
|
||||
rc = apply_rela_bits(loc, val, 1, 20, 0);
|
||||
else if (r_type == R_390_32)
|
||||
*(unsigned int *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 32, 0);
|
||||
else if (r_type == R_390_64)
|
||||
*(unsigned long *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 64, 0);
|
||||
break;
|
||||
case R_390_PC16: /* PC relative 16 bit. */
|
||||
case R_390_PC16DBL: /* PC relative 16 bit shifted by 1. */
|
||||
@@ -227,15 +264,15 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
case R_390_PC64: /* PC relative 64 bit. */
|
||||
val += rela->r_addend - loc;
|
||||
if (r_type == R_390_PC16)
|
||||
*(unsigned short *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 1, 16, 0);
|
||||
else if (r_type == R_390_PC16DBL)
|
||||
*(unsigned short *) loc = val >> 1;
|
||||
rc = apply_rela_bits(loc, val, 1, 16, 1);
|
||||
else if (r_type == R_390_PC32DBL)
|
||||
*(unsigned int *) loc = val >> 1;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 1);
|
||||
else if (r_type == R_390_PC32)
|
||||
*(unsigned int *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 0);
|
||||
else if (r_type == R_390_PC64)
|
||||
*(unsigned long *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 1, 64, 0);
|
||||
break;
|
||||
case R_390_GOT12: /* 12 bit GOT offset. */
|
||||
case R_390_GOT16: /* 16 bit GOT offset. */
|
||||
@@ -260,26 +297,24 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
val = info->got_offset + rela->r_addend;
|
||||
if (r_type == R_390_GOT12 ||
|
||||
r_type == R_390_GOTPLT12)
|
||||
*(unsigned short *) loc = (val & 0xfff) |
|
||||
(*(unsigned short *) loc & 0xf000);
|
||||
rc = apply_rela_bits(loc, val, 0, 12, 0);
|
||||
else if (r_type == R_390_GOT16 ||
|
||||
r_type == R_390_GOTPLT16)
|
||||
*(unsigned short *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 16, 0);
|
||||
else if (r_type == R_390_GOT20 ||
|
||||
r_type == R_390_GOTPLT20)
|
||||
*(unsigned int *) loc =
|
||||
(*(unsigned int *) loc & 0xf00000ff) |
|
||||
(val & 0xfff) << 16 | (val & 0xff000) >> 4;
|
||||
rc = apply_rela_bits(loc, val, 1, 20, 0);
|
||||
else if (r_type == R_390_GOT32 ||
|
||||
r_type == R_390_GOTPLT32)
|
||||
*(unsigned int *) loc = val;
|
||||
else if (r_type == R_390_GOTENT ||
|
||||
r_type == R_390_GOTPLTENT)
|
||||
*(unsigned int *) loc =
|
||||
(val + (Elf_Addr) me->module_core - loc) >> 1;
|
||||
rc = apply_rela_bits(loc, val, 0, 32, 0);
|
||||
else if (r_type == R_390_GOT64 ||
|
||||
r_type == R_390_GOTPLT64)
|
||||
*(unsigned long *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 64, 0);
|
||||
else if (r_type == R_390_GOTENT ||
|
||||
r_type == R_390_GOTPLTENT) {
|
||||
val += (Elf_Addr) me->module_core - loc;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 1);
|
||||
}
|
||||
break;
|
||||
case R_390_PLT16DBL: /* 16 bit PC rel. PLT shifted by 1. */
|
||||
case R_390_PLT32DBL: /* 32 bit PC rel. PLT shifted by 1. */
|
||||
@@ -321,17 +356,17 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
val += rela->r_addend - loc;
|
||||
}
|
||||
if (r_type == R_390_PLT16DBL)
|
||||
*(unsigned short *) loc = val >> 1;
|
||||
rc = apply_rela_bits(loc, val, 1, 16, 1);
|
||||
else if (r_type == R_390_PLTOFF16)
|
||||
*(unsigned short *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 16, 0);
|
||||
else if (r_type == R_390_PLT32DBL)
|
||||
*(unsigned int *) loc = val >> 1;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 1);
|
||||
else if (r_type == R_390_PLT32 ||
|
||||
r_type == R_390_PLTOFF32)
|
||||
*(unsigned int *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 32, 0);
|
||||
else if (r_type == R_390_PLT64 ||
|
||||
r_type == R_390_PLTOFF64)
|
||||
*(unsigned long *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 64, 0);
|
||||
break;
|
||||
case R_390_GOTOFF16: /* 16 bit offset to GOT. */
|
||||
case R_390_GOTOFF32: /* 32 bit offset to GOT. */
|
||||
@@ -339,20 +374,20 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
val = val + rela->r_addend -
|
||||
((Elf_Addr) me->module_core + me->arch.got_offset);
|
||||
if (r_type == R_390_GOTOFF16)
|
||||
*(unsigned short *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 16, 0);
|
||||
else if (r_type == R_390_GOTOFF32)
|
||||
*(unsigned int *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 32, 0);
|
||||
else if (r_type == R_390_GOTOFF64)
|
||||
*(unsigned long *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 0, 64, 0);
|
||||
break;
|
||||
case R_390_GOTPC: /* 32 bit PC relative offset to GOT. */
|
||||
case R_390_GOTPCDBL: /* 32 bit PC rel. off. to GOT shifted by 1. */
|
||||
val = (Elf_Addr) me->module_core + me->arch.got_offset +
|
||||
rela->r_addend - loc;
|
||||
if (r_type == R_390_GOTPC)
|
||||
*(unsigned int *) loc = val;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 0);
|
||||
else if (r_type == R_390_GOTPCDBL)
|
||||
*(unsigned int *) loc = val >> 1;
|
||||
rc = apply_rela_bits(loc, val, 1, 32, 1);
|
||||
break;
|
||||
case R_390_COPY:
|
||||
case R_390_GLOB_DAT: /* Create GOT entry. */
|
||||
@@ -360,19 +395,25 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
||||
case R_390_RELATIVE: /* Adjust by program base. */
|
||||
/* Only needed if we want to support loading of
|
||||
modules linked with -shared. */
|
||||
break;
|
||||
return -ENOEXEC;
|
||||
default:
|
||||
printk(KERN_ERR "module %s: Unknown relocation: %u\n",
|
||||
printk(KERN_ERR "module %s: unknown relocation: %u\n",
|
||||
me->name, r_type);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
if (rc) {
|
||||
printk(KERN_ERR "module %s: relocation error for symbol %s "
|
||||
"(r_type %i, value 0x%lx)\n",
|
||||
me->name, strtab + symtab[r_sym].st_name,
|
||||
r_type, (unsigned long) val);
|
||||
return rc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
|
||||
unsigned int symindex, unsigned int relsec,
|
||||
struct module *me)
|
||||
int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
|
||||
unsigned int symindex, unsigned int relsec,
|
||||
struct module *me)
|
||||
{
|
||||
Elf_Addr base;
|
||||
Elf_Sym *symtab;
|
||||
@@ -388,7 +429,7 @@ apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
|
||||
n = sechdrs[relsec].sh_size / sizeof(Elf_Rela);
|
||||
|
||||
for (i = 0; i < n; i++, rela++) {
|
||||
rc = apply_rela(rela, base, symtab, me);
|
||||
rc = apply_rela(rela, base, symtab, strtab, me);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
@@ -293,7 +293,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
|
||||
* retry this instruction.
|
||||
*/
|
||||
spin_lock(&ipd_lock);
|
||||
tmp = get_clock();
|
||||
tmp = get_tod_clock();
|
||||
if (((tmp - last_ipd) >> 12) < MAX_IPD_TIME)
|
||||
ipd_count++;
|
||||
else
|
||||
|
@@ -367,13 +367,6 @@ static int __hw_perf_event_init(struct perf_event *event)
|
||||
if (ev >= PERF_CPUM_CF_MAX_CTR)
|
||||
return -EINVAL;
|
||||
|
||||
/* The CPU measurement counter facility does not have any interrupts
|
||||
* to do sampling. Sampling must be provided by external means,
|
||||
* for example, by timers.
|
||||
*/
|
||||
if (hwc->sample_period)
|
||||
return -EINVAL;
|
||||
|
||||
/* Use the hardware perf event structure to store the counter number
|
||||
* in 'config' member and the counter set to which the counter belongs
|
||||
* in the 'config_base'. The counter set (config_base) is then used
|
||||
@@ -418,6 +411,12 @@ static int cpumf_pmu_event_init(struct perf_event *event)
|
||||
case PERF_TYPE_HARDWARE:
|
||||
case PERF_TYPE_HW_CACHE:
|
||||
case PERF_TYPE_RAW:
|
||||
/* The CPU measurement counter facility does not have overflow
|
||||
* interrupts to do sampling. Sampling must be provided by
|
||||
* external means, for example, by timers.
|
||||
*/
|
||||
if (is_sampling_event(event))
|
||||
return -ENOENT;
|
||||
err = __hw_perf_event_init(event);
|
||||
break;
|
||||
default:
|
||||
|
@@ -365,16 +365,16 @@ void smp_emergency_stop(cpumask_t *cpumask)
|
||||
u64 end;
|
||||
int cpu;
|
||||
|
||||
end = get_clock() + (1000000UL << 12);
|
||||
end = get_tod_clock() + (1000000UL << 12);
|
||||
for_each_cpu(cpu, cpumask) {
|
||||
struct pcpu *pcpu = pcpu_devices + cpu;
|
||||
set_bit(ec_stop_cpu, &pcpu->ec_mask);
|
||||
while (__pcpu_sigp(pcpu->address, SIGP_EMERGENCY_SIGNAL,
|
||||
0, NULL) == SIGP_CC_BUSY &&
|
||||
get_clock() < end)
|
||||
get_tod_clock() < end)
|
||||
cpu_relax();
|
||||
}
|
||||
while (get_clock() < end) {
|
||||
while (get_tod_clock() < end) {
|
||||
for_each_cpu(cpu, cpumask)
|
||||
if (pcpu_stopped(pcpu_devices + cpu))
|
||||
cpumask_clear_cpu(cpu, cpumask);
|
||||
@@ -694,7 +694,7 @@ static void __init smp_detect_cpus(void)
|
||||
*/
|
||||
static void __cpuinit smp_start_secondary(void *cpuvoid)
|
||||
{
|
||||
S390_lowcore.last_update_clock = get_clock();
|
||||
S390_lowcore.last_update_clock = get_tod_clock();
|
||||
S390_lowcore.restart_stack = (unsigned long) restart_stack;
|
||||
S390_lowcore.restart_fn = (unsigned long) do_restart;
|
||||
S390_lowcore.restart_data = 0;
|
||||
@@ -947,7 +947,7 @@ static ssize_t show_idle_time(struct device *dev,
|
||||
unsigned int sequence;
|
||||
|
||||
do {
|
||||
now = get_clock();
|
||||
now = get_tod_clock();
|
||||
sequence = ACCESS_ONCE(idle->sequence);
|
||||
idle_time = ACCESS_ONCE(idle->idle_time);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
|
@@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);
|
||||
*/
|
||||
unsigned long long notrace __kprobes sched_clock(void)
|
||||
{
|
||||
return tod_to_ns(get_clock_monotonic());
|
||||
return tod_to_ns(get_tod_clock_monotonic());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -194,7 +194,7 @@ static void stp_reset(void);
|
||||
|
||||
void read_persistent_clock(struct timespec *ts)
|
||||
{
|
||||
tod_to_timeval(get_clock() - TOD_UNIX_EPOCH, ts);
|
||||
tod_to_timeval(get_tod_clock() - TOD_UNIX_EPOCH, ts);
|
||||
}
|
||||
|
||||
void read_boot_clock(struct timespec *ts)
|
||||
@@ -204,7 +204,7 @@ void read_boot_clock(struct timespec *ts)
|
||||
|
||||
static cycle_t read_tod_clock(struct clocksource *cs)
|
||||
{
|
||||
return get_clock();
|
||||
return get_tod_clock();
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_tod = {
|
||||
@@ -342,7 +342,7 @@ int get_sync_clock(unsigned long long *clock)
|
||||
|
||||
sw_ptr = &get_cpu_var(clock_sync_word);
|
||||
sw0 = atomic_read(sw_ptr);
|
||||
*clock = get_clock();
|
||||
*clock = get_tod_clock();
|
||||
sw1 = atomic_read(sw_ptr);
|
||||
put_cpu_var(clock_sync_word);
|
||||
if (sw0 == sw1 && (sw0 & 0x80000000U))
|
||||
@@ -486,7 +486,7 @@ static void etr_reset(void)
|
||||
.p0 = 0, .p1 = 0, ._pad1 = 0, .ea = 0,
|
||||
.es = 0, .sl = 0 };
|
||||
if (etr_setr(&etr_eacr) == 0) {
|
||||
etr_tolec = get_clock();
|
||||
etr_tolec = get_tod_clock();
|
||||
set_bit(CLOCK_SYNC_HAS_ETR, &clock_sync_flags);
|
||||
if (etr_port0_online && etr_port1_online)
|
||||
set_bit(CLOCK_SYNC_ETR, &clock_sync_flags);
|
||||
@@ -768,8 +768,8 @@ static int etr_sync_clock(void *data)
|
||||
__ctl_set_bit(14, 21);
|
||||
__ctl_set_bit(0, 29);
|
||||
clock = ((unsigned long long) (aib->edf2.etv + 1)) << 32;
|
||||
old_clock = get_clock();
|
||||
if (set_clock(clock) == 0) {
|
||||
old_clock = get_tod_clock();
|
||||
if (set_tod_clock(clock) == 0) {
|
||||
__udelay(1); /* Wait for the clock to start. */
|
||||
__ctl_clear_bit(0, 29);
|
||||
__ctl_clear_bit(14, 21);
|
||||
@@ -845,7 +845,7 @@ static struct etr_eacr etr_handle_events(struct etr_eacr eacr)
|
||||
* assume that this can have caused an stepping
|
||||
* port switch.
|
||||
*/
|
||||
etr_tolec = get_clock();
|
||||
etr_tolec = get_tod_clock();
|
||||
eacr.p0 = etr_port0_online;
|
||||
if (!eacr.p0)
|
||||
eacr.e0 = 0;
|
||||
@@ -858,7 +858,7 @@ static struct etr_eacr etr_handle_events(struct etr_eacr eacr)
|
||||
* assume that this can have caused an stepping
|
||||
* port switch.
|
||||
*/
|
||||
etr_tolec = get_clock();
|
||||
etr_tolec = get_tod_clock();
|
||||
eacr.p1 = etr_port1_online;
|
||||
if (!eacr.p1)
|
||||
eacr.e1 = 0;
|
||||
@@ -974,7 +974,7 @@ static void etr_update_eacr(struct etr_eacr eacr)
|
||||
etr_eacr = eacr;
|
||||
etr_setr(&etr_eacr);
|
||||
if (dp_changed)
|
||||
etr_tolec = get_clock();
|
||||
etr_tolec = get_tod_clock();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1012,7 +1012,7 @@ static void etr_work_fn(struct work_struct *work)
|
||||
/* Store aib to get the current ETR status word. */
|
||||
BUG_ON(etr_stetr(&aib) != 0);
|
||||
etr_port0.esw = etr_port1.esw = aib.esw; /* Copy status word. */
|
||||
now = get_clock();
|
||||
now = get_tod_clock();
|
||||
|
||||
/*
|
||||
* Update the port information if the last stepping port change
|
||||
@@ -1537,10 +1537,10 @@ static int stp_sync_clock(void *data)
|
||||
if (stp_info.todoff[0] || stp_info.todoff[1] ||
|
||||
stp_info.todoff[2] || stp_info.todoff[3] ||
|
||||
stp_info.tmd != 2) {
|
||||
old_clock = get_clock();
|
||||
old_clock = get_tod_clock();
|
||||
rc = chsc_sstpc(stp_page, STP_OP_SYNC, 0);
|
||||
if (rc == 0) {
|
||||
delta = adjust_time(old_clock, get_clock(), 0);
|
||||
delta = adjust_time(old_clock, get_tod_clock(), 0);
|
||||
fixup_clock_comparator(delta);
|
||||
rc = chsc_sstpi(stp_page, &stp_info,
|
||||
sizeof(struct stp_sstpi));
|
||||
|
@@ -75,6 +75,10 @@ SECTIONS
|
||||
EXIT_TEXT
|
||||
}
|
||||
|
||||
.exit.data : {
|
||||
EXIT_DATA
|
||||
}
|
||||
|
||||
/* early.c uses stsi, which requires page aligned data. */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
INIT_DATA_SECTION(0x100)
|
||||
|
@@ -191,7 +191,7 @@ cputime64_t s390_get_idle_time(int cpu)
|
||||
unsigned int sequence;
|
||||
|
||||
do {
|
||||
now = get_clock();
|
||||
now = get_tod_clock();
|
||||
sequence = ACCESS_ONCE(idle->sequence);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||
|
Reference in New Issue
Block a user