Re: [kvm-unit-tests PATCH v2 1/2] s390x: Introduce symbol for lowcore and use it

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 20 May 2022 16:05:45 +0200
Janis Schoetterl-Glausch <scgl@xxxxxxxxxxxxx> wrote:

> This gets rid of bunch of pointers pointing to the lowcore used in
> various places and replaces it with a unified way of addressing the
> lowcore.
> The new symbol is not a pointer. While this will lead to worse code
> generation (cannot use register 0 for addressing), that should not
> matter too much for kvm unit tests.
> The symbol also will be used to create pointers that the compiler cannot
> warn about as being outside the bounds of an array.

please also briefly explain that you are achieving all this with a small
change in the linker script

> 
> Signed-off-by: Janis Schoetterl-Glausch <scgl@xxxxxxxxxxxxx>
> ---
>  lib/s390x/asm/arch_def.h   |  2 ++
>  lib/s390x/asm/facility.h   |  4 +--
>  lib/s390x/css.h            |  2 --
>  lib/s390x/css_lib.c        | 12 ++++----
>  lib/s390x/fault.c          | 10 +++----
>  lib/s390x/interrupt.c      | 61 +++++++++++++++++++-------------------
>  lib/s390x/mmu.c            |  3 +-
>  s390x/flat.lds             |  1 +
>  s390x/snippets/c/flat.lds  |  1 +
>  s390x/css.c                |  4 +--
>  s390x/diag288.c            |  4 +--
>  s390x/edat.c               |  5 ++--
>  s390x/emulator.c           | 10 +++----
>  s390x/mvpg.c               |  7 ++---
>  s390x/sclp.c               |  3 +-
>  s390x/skrf.c               | 11 +++----
>  s390x/smp.c                | 23 +++++++-------
>  s390x/snippets/c/spec_ex.c |  5 ++--
>  18 files changed, 75 insertions(+), 93 deletions(-)
> 
> diff --git a/lib/s390x/asm/arch_def.h b/lib/s390x/asm/arch_def.h
> index 72553819..78b257b7 100644
> --- a/lib/s390x/asm/arch_def.h
> +++ b/lib/s390x/asm/arch_def.h
> @@ -145,6 +145,8 @@ struct lowcore {
>  } __attribute__ ((__packed__));
>  _Static_assert(sizeof(struct lowcore) == 0x1900, "Lowcore size");
>  
> +extern struct lowcore lowcore;
> +
>  #define PGM_INT_CODE_OPERATION			0x01
>  #define PGM_INT_CODE_PRIVILEGED_OPERATION	0x02
>  #define PGM_INT_CODE_EXECUTE			0x03
> diff --git a/lib/s390x/asm/facility.h b/lib/s390x/asm/facility.h
> index ef0fd037..49380203 100644
> --- a/lib/s390x/asm/facility.h
> +++ b/lib/s390x/asm/facility.h
> @@ -36,10 +36,8 @@ static inline void stfle(uint64_t *fac, unsigned int nb_doublewords)
>  
>  static inline void setup_facilities(void)
>  {
> -	struct lowcore *lc = NULL;
> -
>  	stfl();
> -	memcpy(stfl_doublewords, &lc->stfl, sizeof(lc->stfl));
> +	memcpy(stfl_doublewords, &lowcore.stfl, sizeof(lowcore.stfl));
>  	if (test_facility(7))
>  		stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS);
>  }
> diff --git a/lib/s390x/css.h b/lib/s390x/css.h
> index a6a68577..0a19324b 100644
> --- a/lib/s390x/css.h
> +++ b/lib/s390x/css.h
> @@ -9,8 +9,6 @@
>  #ifndef _S390X_CSS_H_
>  #define _S390X_CSS_H_
>  
> -#define lowcore_ptr ((struct lowcore *)0x0)
> -
>  /* subchannel ID bit 16 must always be one */
>  #define SCHID_ONE	0x00010000
>  
> diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c
> index a9f5097f..b4d1f086 100644
> --- a/lib/s390x/css_lib.c
> +++ b/lib/s390x/css_lib.c
> @@ -357,11 +357,11 @@ void css_irq_io(void)
>  	int sid;
>  
>  	report_prefix_push("Interrupt");
> -	sid = lowcore_ptr->subsys_id_word;
> +	sid = lowcore.subsys_id_word;
>  	/* Lowlevel set the SID as interrupt parameter. */
> -	if (lowcore_ptr->io_int_param != sid) {
> +	if (lowcore.io_int_param != sid) {
>  		report_fail("io_int_param: %x differs from subsys_id_word: %x",
> -			    lowcore_ptr->io_int_param, sid);
> +			    lowcore.io_int_param, sid);
>  		goto pop;
>  	}
>  	report_prefix_pop();
> @@ -387,7 +387,7 @@ void css_irq_io(void)
>  	}
>  pop:
>  	report_prefix_pop();
> -	lowcore_ptr->io_old_psw.mask &= ~PSW_MASK_WAIT;
> +	lowcore.io_old_psw.mask &= ~PSW_MASK_WAIT;
>  }
>  
>  int start_ccw1_chain(unsigned int sid, struct ccw1 *ccw)
> @@ -432,9 +432,9 @@ int wait_and_check_io_completion(int schid)
>  
>  	report_prefix_push("check I/O completion");
>  
> -	if (lowcore_ptr->io_int_param != schid) {
> +	if (lowcore.io_int_param != schid) {
>  		report_fail("interrupt parameter: expected %08x got %08x",
> -			    schid, lowcore_ptr->io_int_param);
> +			    schid, lowcore.io_int_param);
>  		ret = -1;
>  		goto end;
>  	}
> diff --git a/lib/s390x/fault.c b/lib/s390x/fault.c
> index d3ef00e4..efa62fcb 100644
> --- a/lib/s390x/fault.c
> +++ b/lib/s390x/fault.c
> @@ -13,8 +13,6 @@
>  #include <asm/page.h>
>  #include <fault.h>
>  
> -static struct lowcore *lc = (struct lowcore *)0x0;
> -
>  /* Decodes the protection exceptions we'll most likely see */
>  static void print_decode_pgm_prot(uint64_t teid)
>  {
> @@ -37,7 +35,7 @@ static void print_decode_pgm_prot(uint64_t teid)
>  void print_decode_teid(uint64_t teid)
>  {
>  	int asce_id = teid & 3;
> -	bool dat = lc->pgm_old_psw.mask & PSW_MASK_DAT;
> +	bool dat = lowcore.pgm_old_psw.mask & PSW_MASK_DAT;
>  
>  	printf("Memory exception information:\n");
>  	printf("DAT: %s\n", dat ? "on" : "off");
> @@ -58,15 +56,15 @@ void print_decode_teid(uint64_t teid)
>  		break;
>  	}
>  
> -	if (lc->pgm_int_code == PGM_INT_CODE_PROTECTION)
> +	if (lowcore.pgm_int_code == PGM_INT_CODE_PROTECTION)
>  		print_decode_pgm_prot(teid);
>  
>  	/*
>  	 * If teid bit 61 is off for these two exception the reported
>  	 * address is unpredictable.
>  	 */
> -	if ((lc->pgm_int_code == PGM_INT_CODE_SECURE_STOR_ACCESS ||
> -	     lc->pgm_int_code == PGM_INT_CODE_SECURE_STOR_VIOLATION) &&
> +	if ((lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_ACCESS ||
> +	     lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_VIOLATION) &&
>  	    !test_bit_inv(61, &teid)) {
>  		printf("Address: %lx, unpredictable\n ", teid & PAGE_MASK);
>  		return;
> diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
> index 27d3b767..6da20c44 100644
> --- a/lib/s390x/interrupt.c
> +++ b/lib/s390x/interrupt.c
> @@ -18,20 +18,19 @@
>  static bool pgm_int_expected;
>  static bool ext_int_expected;
>  static void (*pgm_cleanup_func)(void);
> -static struct lowcore *lc;
>  
>  void expect_pgm_int(void)
>  {
>  	pgm_int_expected = true;
> -	lc->pgm_int_code = 0;
> -	lc->trans_exc_id = 0;
> +	lowcore.pgm_int_code = 0;
> +	lowcore.trans_exc_id = 0;
>  	mb();
>  }
>  
>  void expect_ext_int(void)
>  {
>  	ext_int_expected = true;
> -	lc->ext_int_code = 0;
> +	lowcore.ext_int_code = 0;
>  	mb();
>  }
>  
> @@ -40,9 +39,9 @@ uint16_t clear_pgm_int(void)
>  	uint16_t code;
>  
>  	mb();
> -	code = lc->pgm_int_code;
> -	lc->pgm_int_code = 0;
> -	lc->trans_exc_id = 0;
> +	code = lowcore.pgm_int_code;
> +	lowcore.pgm_int_code = 0;
> +	lowcore.trans_exc_id = 0;
>  	pgm_int_expected = false;
>  	return code;
>  }
> @@ -50,9 +49,9 @@ uint16_t clear_pgm_int(void)
>  void check_pgm_int_code(uint16_t code)
>  {
>  	mb();
> -	report(code == lc->pgm_int_code,
> +	report(code == lowcore.pgm_int_code,
>  	       "Program interrupt: expected(%d) == received(%d)", code,
> -	       lc->pgm_int_code);
> +	       lowcore.pgm_int_code);
>  }
>  
>  void register_pgm_cleanup_func(void (*f)(void))
> @@ -63,29 +62,29 @@ void register_pgm_cleanup_func(void (*f)(void))
>  static void fixup_pgm_int(struct stack_frame_int *stack)
>  {
>  	/* If we have an error on SIE we directly move to sie_exit */
> -	if (lc->pgm_old_psw.addr >= (uint64_t)&sie_entry &&
> -	    lc->pgm_old_psw.addr <= (uint64_t)&sie_exit) {
> -		lc->pgm_old_psw.addr = (uint64_t)&sie_exit;
> +	if (lowcore.pgm_old_psw.addr >= (uint64_t)&sie_entry &&
> +	    lowcore.pgm_old_psw.addr <= (uint64_t)&sie_exit) {
> +		lowcore.pgm_old_psw.addr = (uint64_t)&sie_exit;
>  	}
>  
> -	switch (lc->pgm_int_code) {
> +	switch (lowcore.pgm_int_code) {
>  	case PGM_INT_CODE_PRIVILEGED_OPERATION:
>  		/* Normal operation is in supervisor state, so this exception
>  		 * was produced intentionally and we should return to the
>  		 * supervisor state.
>  		 */
> -		lc->pgm_old_psw.mask &= ~PSW_MASK_PSTATE;
> +		lowcore.pgm_old_psw.mask &= ~PSW_MASK_PSTATE;
>  		break;
>  	case PGM_INT_CODE_PROTECTION:
>  		/* Handling for iep.c test case. */
> -		if (prot_is_iep(lc->trans_exc_id))
> +		if (prot_is_iep(lowcore.trans_exc_id))
>  			/*
>  			 * We branched to the instruction that caused
>  			 * the exception so we can use the return
>  			 * address in GR14 to jump back and continue
>  			 * executing test code.
>  			 */
> -			lc->pgm_old_psw.addr = stack->grs0[12];
> +			lowcore.pgm_old_psw.addr = stack->grs0[12];
>  		break;
>  	case PGM_INT_CODE_SEGMENT_TRANSLATION:
>  	case PGM_INT_CODE_PAGE_TRANSLATION:
> @@ -122,14 +121,14 @@ static void fixup_pgm_int(struct stack_frame_int *stack)
>  		/* The interrupt was nullified, the old PSW points at the
>  		 * responsible instruction. Forward the PSW so we don't loop.
>  		 */
> -		lc->pgm_old_psw.addr += lc->pgm_int_id;
> +		lowcore.pgm_old_psw.addr += lowcore.pgm_int_id;
>  	}
>  	/* suppressed/terminated/completed point already at the next address */
>  }
>  
>  static void print_storage_exception_information(void)
>  {
> -	switch (lc->pgm_int_code) {
> +	switch (lowcore.pgm_int_code) {
>  	case PGM_INT_CODE_PROTECTION:
>  	case PGM_INT_CODE_PAGE_TRANSLATION:
>  	case PGM_INT_CODE_SEGMENT_TRANSLATION:
> @@ -140,7 +139,7 @@ static void print_storage_exception_information(void)
>  	case PGM_INT_CODE_SECURE_STOR_ACCESS:
>  	case PGM_INT_CODE_NON_SECURE_STOR_ACCESS:
>  	case PGM_INT_CODE_SECURE_STOR_VIOLATION:
> -		print_decode_teid(lc->trans_exc_id);
> +		print_decode_teid(lowcore.trans_exc_id);
>  		break;
>  	}
>  }
> @@ -165,13 +164,13 @@ static void print_pgm_info(struct stack_frame_int *stack)
>  {
>  	bool in_sie;
>  
> -	in_sie = (lc->pgm_old_psw.addr >= (uintptr_t)sie_entry &&
> -		  lc->pgm_old_psw.addr <= (uintptr_t)sie_exit);
> +	in_sie = (lowcore.pgm_old_psw.addr >= (uintptr_t)sie_entry &&
> +		  lowcore.pgm_old_psw.addr <= (uintptr_t)sie_exit);
>  
>  	printf("\n");
>  	printf("Unexpected program interrupt %s: %#x on cpu %d at %#lx, ilen %d\n",
>  	       in_sie ? "in SIE" : "",
> -	       lc->pgm_int_code, stap(), lc->pgm_old_psw.addr, lc->pgm_int_id);
> +	       lowcore.pgm_int_code, stap(), lowcore.pgm_old_psw.addr, lowcore.pgm_int_id);
>  	print_int_regs(stack);
>  	dump_stack();
>  
> @@ -201,13 +200,13 @@ void handle_pgm_int(struct stack_frame_int *stack)
>  void handle_ext_int(struct stack_frame_int *stack)
>  {
>  	if (!ext_int_expected &&
> -	    lc->ext_int_code != EXT_IRQ_SERVICE_SIG) {
> +	    lowcore.ext_int_code != EXT_IRQ_SERVICE_SIG) {
>  		report_abort("Unexpected external call interrupt (code %#x): on cpu %d at %#lx",
> -			     lc->ext_int_code, stap(), lc->ext_old_psw.addr);
> +			     lowcore.ext_int_code, stap(), lowcore.ext_old_psw.addr);
>  		return;
>  	}
>  
> -	if (lc->ext_int_code == EXT_IRQ_SERVICE_SIG) {
> +	if (lowcore.ext_int_code == EXT_IRQ_SERVICE_SIG) {
>  		stack->crs[0] &= ~(1UL << 9);
>  		sclp_handle_ext();
>  	} else {
> @@ -215,13 +214,13 @@ void handle_ext_int(struct stack_frame_int *stack)
>  	}
>  
>  	if (!(stack->crs[0] & CR0_EXTM_MASK))
> -		lc->ext_old_psw.mask &= ~PSW_MASK_EXT;
> +		lowcore.ext_old_psw.mask &= ~PSW_MASK_EXT;
>  }
>  
>  void handle_mcck_int(void)
>  {
>  	report_abort("Unexpected machine check interrupt: on cpu %d at %#lx",
> -		     stap(), lc->mcck_old_psw.addr);
> +		     stap(), lowcore.mcck_old_psw.addr);
>  }
>  
>  static void (*io_int_func)(void);
> @@ -232,7 +231,7 @@ void handle_io_int(void)
>  		return io_int_func();
>  
>  	report_abort("Unexpected io interrupt: on cpu %d at %#lx",
> -		     stap(), lc->io_old_psw.addr);
> +		     stap(), lowcore.io_old_psw.addr);
>  }
>  
>  int register_io_int_func(void (*f)(void))
> @@ -253,14 +252,14 @@ int unregister_io_int_func(void (*f)(void))
>  
>  void handle_svc_int(void)
>  {
> -	uint16_t code = lc->svc_int_code;
> +	uint16_t code = lowcore.svc_int_code;
>  
>  	switch (code) {
>  	case SVC_LEAVE_PSTATE:
> -		lc->svc_old_psw.mask &= ~PSW_MASK_PSTATE;
> +		lowcore.svc_old_psw.mask &= ~PSW_MASK_PSTATE;
>  		break;
>  	default:
>  		report_abort("Unexpected supervisor call interrupt: code %#x on cpu %d at %#lx",
> -			      code, stap(), lc->svc_old_psw.addr);
> +			      code, stap(), lowcore.svc_old_psw.addr);
>  	}
>  }
> diff --git a/lib/s390x/mmu.c b/lib/s390x/mmu.c
> index 6f9e6502..c9f8754c 100644
> --- a/lib/s390x/mmu.c
> +++ b/lib/s390x/mmu.c
> @@ -43,7 +43,6 @@ void configure_dat(int enable)
>  
>  static void mmu_enable(pgd_t *pgtable)
>  {
> -	struct lowcore *lc = NULL;
>  	const uint64_t asce = __pa(pgtable) | ASCE_DT_REGION1 |
>  			      REGION_TABLE_LENGTH;
>  
> @@ -55,7 +54,7 @@ static void mmu_enable(pgd_t *pgtable)
>  	configure_dat(1);
>  
>  	/* we can now also use DAT unconditionally in our PGM handler */
> -	lc->pgm_new_psw.mask |= PSW_MASK_DAT;
> +	lowcore.pgm_new_psw.mask |= PSW_MASK_DAT;
>  }
>  
>  /*
> diff --git a/s390x/flat.lds b/s390x/flat.lds
> index 86dffacd..de9da1a8 100644
> --- a/s390x/flat.lds
> +++ b/s390x/flat.lds
> @@ -7,6 +7,7 @@ SECTIONS
>  		 * address 0x10000 (cstart64.S .init).
>  		 */
>  		. = 0;
> +		lowcore = .;
>  		 LONG(0x00080000)
>  		 LONG(0x80010000)
>  		 /* Restart new PSW for booting via PSW restart. */
> diff --git a/s390x/snippets/c/flat.lds b/s390x/snippets/c/flat.lds
> index 59974b38..260ab1c4 100644
> --- a/s390x/snippets/c/flat.lds
> +++ b/s390x/snippets/c/flat.lds
> @@ -7,6 +7,7 @@ SECTIONS
>  		 * address 0x4000 (cstart.S .init).
>  		 */
>  		. = 0;
> +		lowcore = .;
>  		 LONG(0x00080000)
>  		 LONG(0x80004000)
>  		 /* Restart new PSW for booting via PSW restart. */
> diff --git a/s390x/css.c b/s390x/css.c
> index fabe5237..4b6e31b3 100644
> --- a/s390x/css.c
> +++ b/s390x/css.c
> @@ -74,7 +74,7 @@ static void test_sense(void)
>  		return;
>  	}
>  
> -	lowcore_ptr->io_int_param = 0;
> +	lowcore.io_int_param = 0;
>  
>  	senseid = alloc_io_mem(sizeof(*senseid), 0);
>  	if (!senseid) {
> @@ -143,7 +143,7 @@ static void sense_id(void)
>  static void css_init(void)
>  {
>  	assert(register_io_int_func(css_irq_io) == 0);
> -	lowcore_ptr->io_int_param = 0;
> +	lowcore.io_int_param = 0;
>  
>  	report(get_chsc_scsc(), "Store Channel Characteristics");
>  }
> diff --git a/s390x/diag288.c b/s390x/diag288.c
> index 072c04a5..e414865b 100644
> --- a/s390x/diag288.c
> +++ b/s390x/diag288.c
> @@ -12,8 +12,6 @@
>  #include <asm/asm-offsets.h>
>  #include <asm/interrupt.h>
>  
> -struct lowcore *lc = (struct lowcore *)0x0;
> -
>  #define CODE_INIT	0
>  #define CODE_CHANGE	1
>  #define CODE_CANCEL	2
> @@ -92,7 +90,7 @@ static void test_bite(void)
>  	load_psw_mask(mask);
>  
>  	/* Arm watchdog */
> -	lc->restart_new_psw.mask = extract_psw_mask() & ~PSW_MASK_EXT;
> +	lowcore.restart_new_psw.mask = extract_psw_mask() & ~PSW_MASK_EXT;
>  	diag288(CODE_INIT, 15, ACTION_RESTART);
>  	asm volatile("		larl	%r0, 1f\n"
>  		     "		stg	%r0, 424\n"
> diff --git a/s390x/edat.c b/s390x/edat.c
> index c3bee0c8..c6c25042 100644
> --- a/s390x/edat.c
> +++ b/s390x/edat.c
> @@ -23,7 +23,6 @@
>  static uint8_t prefix_buf[LC_SIZE] __attribute__((aligned(LC_SIZE)));
>  static unsigned int tmp[1024] __attribute__((aligned(PAGE_SIZE)));
>  static void *root, *mem, *m;
> -static struct lowcore *lc;
>  volatile unsigned int *p;
>  
>  /*
> @@ -34,10 +33,10 @@ static bool check_pgm_prot(void *ptr)
>  {
>  	union teid teid;
>  
> -	if (lc->pgm_int_code != PGM_INT_CODE_PROTECTION)
> +	if (lowcore.pgm_int_code != PGM_INT_CODE_PROTECTION)
>  		return false;
>  
> -	teid.val = lc->trans_exc_id;
> +	teid.val = lowcore.trans_exc_id;
>  
>  	/*
>  	 * depending on the presence of the ESOP feature, the rest of the
> diff --git a/s390x/emulator.c b/s390x/emulator.c
> index b2787a55..c9182ea4 100644
> --- a/s390x/emulator.c
> +++ b/s390x/emulator.c
> @@ -14,8 +14,6 @@
>  #include <asm/float.h>
>  #include <linux/compiler.h>
>  
> -struct lowcore *lc = NULL;
> -
>  static inline void __test_spm_ipm(uint8_t cc, uint8_t key)
>  {
>  	uint64_t in = (cc << 28) | (key << 24);
> @@ -262,7 +260,7 @@ static void test_prno(void)
>  static void test_dxc(void)
>  {
>  	/* DXC (0xff) is to be stored in LC and FPC on a trap (CRT) with AFP */
> -	lc->dxc_vxc = 0x12345678;
> +	lowcore.dxc_vxc = 0x12345678;
>  	set_fpc_dxc(0);
>  
>  	report_prefix_push("afp");
> @@ -271,12 +269,12 @@ static void test_dxc(void)
>  		     : : "r"(0) : "memory");
>  	check_pgm_int_code(PGM_INT_CODE_DATA);
>  
> -	report(lc->dxc_vxc == 0xff, "dxc in LC");
> +	report(lowcore.dxc_vxc == 0xff, "dxc in LC");
>  	report(get_fpc_dxc() == 0xff, "dxc in FPC");
>  	report_prefix_pop();
>  
>  	/* DXC (0xff) is to be stored in LC only on a trap (CRT) without AFP */
> -	lc->dxc_vxc = 0x12345678;
> +	lowcore.dxc_vxc = 0x12345678;
>  	set_fpc_dxc(0);
>  
>  	report_prefix_push("no-afp");
> @@ -288,7 +286,7 @@ static void test_dxc(void)
>  	afp_enable();
>  	check_pgm_int_code(PGM_INT_CODE_DATA);
>  
> -	report(lc->dxc_vxc == 0xff, "dxc in LC");
> +	report(lowcore.dxc_vxc == 0xff, "dxc in LC");
>  	report(get_fpc_dxc() == 0, "dxc not in FPC");
>  	report_prefix_pop();
>  }
> diff --git a/s390x/mvpg.c b/s390x/mvpg.c
> index 04e5218f..296338d4 100644
> --- a/s390x/mvpg.c
> +++ b/s390x/mvpg.c
> @@ -33,7 +33,6 @@
>  
>  static uint8_t source[PAGE_SIZE]  __attribute__((aligned(PAGE_SIZE)));
>  static uint8_t buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
> -static struct lowcore * const lc;
>  
>  /* Keep track of fresh memory */
>  static uint8_t *fresh;
> @@ -87,7 +86,7 @@ static int page_ok(const uint8_t *p)
>   */
>  static inline bool check_oai(void)
>  {
> -	return *(uint8_t *)(lc->pgm_old_psw.addr - 1) == lc->op_acc_id;
> +	return *(uint8_t *)(lowcore.pgm_old_psw.addr - 1) == lowcore.op_acc_id;
>  }
>  
>  static void test_exceptions(void)
> @@ -216,7 +215,7 @@ static void test_mmu_prot(void)
>  
>  	report_prefix_push("source invalid");
>  	protect_page(source, PAGE_ENTRY_I);
> -	lc->op_acc_id = 0;
> +	lowcore.op_acc_id = 0;
>  	expect_pgm_int();
>  	mvpg(0, fresh, source);
>  	report(clear_pgm_int() == PGM_INT_CODE_PAGE_TRANSLATION, "exception");
> @@ -227,7 +226,7 @@ static void test_mmu_prot(void)
>  
>  	report_prefix_push("destination invalid");
>  	protect_page(fresh, PAGE_ENTRY_I);
> -	lc->op_acc_id = 0;
> +	lowcore.op_acc_id = 0;
>  	expect_pgm_int();
>  	mvpg(0, fresh, source);
>  	report(clear_pgm_int() == PGM_INT_CODE_PAGE_TRANSLATION, "exception");
> diff --git a/s390x/sclp.c b/s390x/sclp.c
> index 73d722fb..1abb9029 100644
> --- a/s390x/sclp.c
> +++ b/s390x/sclp.c
> @@ -31,7 +31,6 @@ static union {
>  	WriteEventData data;
>  } sccb_template;
>  static uint32_t valid_code;						/* valid command code for READ SCP INFO */
> -static struct lowcore *lc;
>  
>  /**
>   * Perform one service call, handling exceptions and interrupts.
> @@ -43,7 +42,7 @@ static int sclp_service_call_test(unsigned int command, void *sccb)
>  	sclp_mark_busy();
>  	sclp_setup_int();
>  	cc = servc(command, __pa(sccb));
> -	if (lc->pgm_int_code) {
> +	if (lowcore.pgm_int_code) {
>  		sclp_handle_ext();
>  		return 0;
>  	}
> diff --git a/s390x/skrf.c b/s390x/skrf.c
> index b9a2e902..1a811894 100644
> --- a/s390x/skrf.c
> +++ b/s390x/skrf.c
> @@ -123,17 +123,15 @@ static void set_flag(int val)
>  
>  static void ecall_cleanup(void)
>  {
> -	struct lowcore *lc = (void *)0x0;
> -
> -	lc->ext_new_psw.mask = PSW_MASK_64;
> -	lc->sw_int_crs[0] = BIT_ULL(CTL0_AFP);
> +	lowcore.ext_new_psw.mask = PSW_MASK_64;
> +	lowcore.sw_int_crs[0] = BIT_ULL(CTL0_AFP);
>  
>  	/*
>  	 * PGM old contains the ext new PSW, we need to clean it up,
>  	 * so we don't get a special operation exception on the lpswe
>  	 * of pgm old.
>  	 */
> -	lc->pgm_old_psw.mask = PSW_MASK_64;
> +	lowcore.pgm_old_psw.mask = PSW_MASK_64;
>  
>  	check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
>  	set_flag(1);
> @@ -142,13 +140,12 @@ static void ecall_cleanup(void)
>  /* Set a key into the external new psw mask and open external call masks */
>  static void ecall_setup(void)
>  {
> -	struct lowcore *lc = (void *)0x0;
>  	uint64_t mask;
>  
>  	register_pgm_cleanup_func(ecall_cleanup);
>  	expect_pgm_int();
>  	/* Put a skey into the ext new psw */
> -	lc->ext_new_psw.mask = 0x00F0000000000000UL | PSW_MASK_64;
> +	lowcore.ext_new_psw.mask = 0x00F0000000000000UL | PSW_MASK_64;
>  	/* Open up ext masks */
>  	ctl_set_bit(0, CTL0_EXTERNAL_CALL);
>  	mask = extract_psw_mask();
> diff --git a/s390x/smp.c b/s390x/smp.c
> index de3aba71..6d474d0d 100644
> --- a/s390x/smp.c
> +++ b/s390x/smp.c
> @@ -155,28 +155,27 @@ static void test_stop(void)
>  static void test_stop_store_status(void)
>  {
>  	struct cpu *cpu = smp_cpu_from_idx(1);
> -	struct lowcore *lc = (void *)0x0;
>  
>  	report_prefix_push("stop store status");
>  	report_prefix_push("running");
>  	smp_cpu_restart(1);
> -	lc->prefix_sa = 0;
> -	lc->grs_sa[15] = 0;
> +	lowcore.prefix_sa = 0;
> +	lowcore.grs_sa[15] = 0;
>  	smp_cpu_stop_store_status(1);
>  	mb();
>  	report(smp_cpu_stopped(1), "cpu stopped");
> -	report(lc->prefix_sa == (uint32_t)(uintptr_t)cpu->lowcore, "prefix");
> -	report(lc->grs_sa[15], "stack");
> +	report(lowcore.prefix_sa == (uint32_t)(uintptr_t)cpu->lowcore, "prefix");
> +	report(lowcore.grs_sa[15], "stack");
>  	report_prefix_pop();
>  
>  	report_prefix_push("stopped");
> -	lc->prefix_sa = 0;
> -	lc->grs_sa[15] = 0;
> +	lowcore.prefix_sa = 0;
> +	lowcore.grs_sa[15] = 0;
>  	smp_cpu_stop_store_status(1);
>  	mb();
>  	report(smp_cpu_stopped(1), "cpu stopped");
> -	report(lc->prefix_sa == (uint32_t)(uintptr_t)cpu->lowcore, "prefix");
> -	report(lc->grs_sa[15], "stack");
> +	report(lowcore.prefix_sa == (uint32_t)(uintptr_t)cpu->lowcore, "prefix");
> +	report(lowcore.grs_sa[15], "stack");
>  	report_prefix_pop();
>  
>  	report_prefix_pop();
> @@ -290,7 +289,6 @@ static void test_set_prefix(void)
>  static void ecall(void)
>  {
>  	unsigned long mask;
> -	struct lowcore *lc = (void *)0x0;
>  
>  	expect_ext_int();
>  	ctl_set_bit(0, CTL0_EXTERNAL_CALL);
> @@ -298,7 +296,7 @@ static void ecall(void)
>  	mask |= PSW_MASK_EXT;
>  	load_psw_mask(mask);
>  	set_flag(1);
> -	while (lc->ext_int_code != 0x1202) { mb(); }
> +	while (lowcore.ext_int_code != 0x1202) { mb(); }
>  	report_pass("received");
>  	set_flag(1);
>  }
> @@ -324,7 +322,6 @@ static void test_ecall(void)
>  static void emcall(void)
>  {
>  	unsigned long mask;
> -	struct lowcore *lc = (void *)0x0;
>  
>  	expect_ext_int();
>  	ctl_set_bit(0, CTL0_EMERGENCY_SIGNAL);
> @@ -332,7 +329,7 @@ static void emcall(void)
>  	mask |= PSW_MASK_EXT;
>  	load_psw_mask(mask);
>  	set_flag(1);
> -	while (lc->ext_int_code != 0x1201) { mb(); }
> +	while (lowcore.ext_int_code != 0x1201) { mb(); }
>  	report_pass("received");
>  	set_flag(1);
>  }
> diff --git a/s390x/snippets/c/spec_ex.c b/s390x/snippets/c/spec_ex.c
> index 71655ddb..40c170e6 100644
> --- a/s390x/snippets/c/spec_ex.c
> +++ b/s390x/snippets/c/spec_ex.c
> @@ -10,12 +10,11 @@
>  
>  __attribute__((section(".text"))) int main(void)
>  {
> -	struct lowcore *lowcore = (struct lowcore *) 0;
>  	uint64_t bad_psw = 0;
>  
>  	/* PSW bit 12 has no name or meaning and must be 0 */
> -	lowcore->pgm_new_psw.mask = BIT(63 - 12);
> -	lowcore->pgm_new_psw.addr = 0xdeadbeee;
> +	lowcore.pgm_new_psw.mask = BIT(63 - 12);
> +	lowcore.pgm_new_psw.addr = 0xdeadbeee;
>  	asm volatile ("lpsw %0" :: "Q"(bad_psw));
>  	return 0;
>  }




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux