Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 309594
b: refs/heads/master
c: 73bf463
h: refs/heads/master
v: v3
  • Loading branch information
Michael Holzheu authored and Martin Schwidefsky committed May 30, 2012
1 parent baa6c9d commit badd5e7
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f4815ac6c935b8e441fe12504d62e0e8ff7f7ce5
refs/heads/master: 73bf463efaba6a1efe69349c6d7275d03468adf4
2 changes: 1 addition & 1 deletion trunk/arch/s390/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ clear_user(void __user *to, unsigned long n)
}

extern int memcpy_real(void *, void *, size_t);
extern void copy_to_absolute_zero(void *dest, void *src, size_t count);
extern void memcpy_absolute(void *, void *, size_t);
extern int copy_to_user_real(void __user *dest, void *src, size_t count);
extern int copy_from_user_real(void *dest, void __user *src, size_t count);

Expand Down
15 changes: 9 additions & 6 deletions trunk/arch/s390/kernel/ipl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1528,12 +1528,15 @@ static struct shutdown_action __refdata dump_action = {

static void dump_reipl_run(struct shutdown_trigger *trigger)
{
u32 csum;

csum = csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
copy_to_absolute_zero(&S390_lowcore.ipib_checksum, &csum, sizeof(csum));
copy_to_absolute_zero(&S390_lowcore.ipib, &reipl_block_actual,
sizeof(reipl_block_actual));
struct {
void *addr;
__u32 csum;
} __packed ipib;

ipib.csum = csum_partial(reipl_block_actual,
reipl_block_actual->hdr.len, 0);
ipib.addr = reipl_block_actual;
memcpy_absolute(&S390_lowcore.ipib, &ipib, sizeof(ipib));
dump_run(trigger);
}

Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/s390/kernel/os_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ void __init os_info_init(void)
os_info.version_minor = OS_INFO_VERSION_MINOR;
os_info.magic = OS_INFO_MAGIC;
os_info.csum = os_info_csum(&os_info);
copy_to_absolute_zero(&S390_lowcore.os_info, &ptr, sizeof(ptr));
memcpy_absolute(&S390_lowcore.os_info, &ptr, sizeof(ptr));
}

#ifdef CONFIG_CRASH_DUMP
Expand Down
12 changes: 7 additions & 5 deletions trunk/arch/s390/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,10 +428,12 @@ static void __init setup_lowcore(void)
lc->restart_fn = (unsigned long) do_restart;
lc->restart_data = 0;
lc->restart_source = -1UL;
memcpy(&S390_lowcore.restart_stack, &lc->restart_stack,
4*sizeof(unsigned long));
copy_to_absolute_zero(&S390_lowcore.restart_psw,
&lc->restart_psw, sizeof(psw_t));

/* Setup absolute zero lowcore */
memcpy_absolute(&S390_lowcore.restart_stack, &lc->restart_stack,
4 * sizeof(unsigned long));
memcpy_absolute(&S390_lowcore.restart_psw, &lc->restart_psw,
sizeof(lc->restart_psw));

set_prefix((u32)(unsigned long) lc);
lowcore_ptr[0] = lc;
Expand Down Expand Up @@ -598,7 +600,7 @@ static void __init setup_vmcoreinfo(void)
#ifdef CONFIG_KEXEC
unsigned long ptr = paddr_vmcoreinfo_note();

copy_to_absolute_zero(&S390_lowcore.vmcore_info, &ptr, sizeof(ptr));
memcpy_absolute(&S390_lowcore.vmcore_info, &ptr, sizeof(ptr));
#endif
}

Expand Down
38 changes: 16 additions & 22 deletions trunk/arch/s390/mm/maccess.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,27 @@ int memcpy_real(void *dest, void *src, size_t count)
}

/*
* Copy memory to absolute zero
* Copy memory in absolute mode (kernel to kernel)
*/
void copy_to_absolute_zero(void *dest, void *src, size_t count)
void memcpy_absolute(void *dest, void *src, size_t count)
{
unsigned long cr0;
unsigned long cr0, flags, prefix;

BUG_ON((unsigned long) dest + count >= sizeof(struct _lowcore));
preempt_disable();
flags = arch_local_irq_save();
__ctl_store(cr0, 0, 0);
__ctl_clear_bit(0, 28); /* disable lowcore protection */
memcpy_real(dest + store_prefix(), src, count);
prefix = store_prefix();
if (prefix) {
local_mcck_disable();
set_prefix(0);
memcpy(dest, src, count);
set_prefix(prefix);
local_mcck_enable();
} else {
memcpy(dest, src, count);
}
__ctl_load(cr0, 0, 0);
preempt_enable();
arch_local_irq_restore(flags);
}

/*
Expand Down Expand Up @@ -187,20 +195,6 @@ static int is_swapped(unsigned long addr)
return 0;
}

/*
* Return swapped prefix or zero page address
*/
static unsigned long get_swapped(unsigned long addr)
{
unsigned long prefix = store_prefix();

if (addr < sizeof(struct _lowcore))
return addr + prefix;
if (addr >= prefix && addr < prefix + sizeof(struct _lowcore))
return addr - prefix;
return addr;
}

/*
* Convert a physical pointer for /dev/mem access
*
Expand All @@ -218,7 +212,7 @@ void *xlate_dev_mem_ptr(unsigned long addr)
size = PAGE_SIZE - (addr & ~PAGE_MASK);
bounce = (void *) __get_free_page(GFP_ATOMIC);
if (bounce)
memcpy_real(bounce, (void *) get_swapped(addr), size);
memcpy_absolute(bounce, (void *) addr, size);
}
preempt_enable();
put_online_cpus();
Expand Down

0 comments on commit badd5e7

Please sign in to comment.