Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3813329 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
parents 97d26b80 70aa488c
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -825,14 +825,16 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
		 * XXX Should have an arch-hook for running this after final section
		 *     addresses have been selected...
		 */
		/* See if gp can cover the entire core module:  */
		uint64_t gp = (uint64_t) mod->module_core + MAX_LTOFF / 2;
		if (mod->core_size >= MAX_LTOFF)
		uint64_t gp;
		if (mod->core_size > MAX_LTOFF)
			/*
			 * This takes advantage of fact that SHF_ARCH_SMALL gets allocated
			 * at the end of the module.
			 */
			gp = (uint64_t) mod->module_core + mod->core_size - MAX_LTOFF / 2;
			gp = mod->core_size - MAX_LTOFF / 2;
		else
			gp = mod->core_size / 2;
		gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
		mod->arch.gp = gp;
		DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
	}
+2 −1
Original line number Diff line number Diff line
@@ -720,7 +720,8 @@ cpu_init (void)
	ia64_set_kr(IA64_KR_PT_BASE, __pa(ia64_imva(empty_zero_page)));

	/*
	 * Initialize default control register to defer all speculative faults.  The
	 * Initialize default control register to defer speculative faults except
	 * for those arising from TLB misses, which are not deferred.  The
	 * kernel MUST NOT depend on a particular setting of these bits (in other words,
	 * the kernel must have recovery code for all speculative accesses).  Turn on
	 * dcr.lc as per recommendation by the architecture team.  Most IA-32 apps
+18 −0
Original line number Diff line number Diff line
@@ -111,6 +111,24 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
	siginfo_t siginfo;
	int sig, code;

	/* break.b always sets cr.iim to 0, which causes problems for
	 * debuggers.  Get the real break number from the original instruction,
	 * but only for kernel code.  User space break.b is left alone, to
	 * preserve the existing behaviour.  All break codings have the same
	 * format, so there is no need to check the slot type.
	 */
	if (break_num == 0 && !user_mode(regs)) {
		struct ia64_psr *ipsr = ia64_psr(regs);
		unsigned long *bundle = (unsigned long *)regs->cr_iip;
		unsigned long slot;
		switch (ipsr->ri) {
		      case 0:  slot = (bundle[0] >>  5); break;
		      case 1:  slot = (bundle[0] >> 46) | (bundle[1] << 18); break;
		      default: slot = (bundle[1] >> 23); break;
		}
		break_num = ((slot >> 36 & 1) << 20) | (slot >> 6 & 0xfffff);
	}

	/* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
	siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
	siginfo.si_imm = break_num;
+17 −2
Original line number Diff line number Diff line
@@ -305,8 +305,9 @@ setup_gate (void)
	struct page *page;

	/*
	 * Map the gate page twice: once read-only to export the ELF headers etc. and once
	 * execute-only page to enable privilege-promotion via "epc":
	 * Map the gate page twice: once read-only to export the ELF
	 * headers etc. and once execute-only page to enable
	 * privilege-promotion via "epc":
	 */
	page = virt_to_page(ia64_imva(__start_gate_section));
	put_kernel_page(page, GATE_ADDR, PAGE_READONLY);
@@ -315,6 +316,20 @@ setup_gate (void)
	put_kernel_page(page, GATE_ADDR + PAGE_SIZE, PAGE_GATE);
#else
	put_kernel_page(page, GATE_ADDR + PERCPU_PAGE_SIZE, PAGE_GATE);
	/* Fill in the holes (if any) with read-only zero pages: */
	{
		unsigned long addr;

		for (addr = GATE_ADDR + PAGE_SIZE;
		     addr < GATE_ADDR + PERCPU_PAGE_SIZE;
		     addr += PAGE_SIZE)
		{
			put_kernel_page(ZERO_PAGE(0), addr,
					PAGE_READONLY);
			put_kernel_page(ZERO_PAGE(0), addr + PERCPU_PAGE_SIZE,
					PAGE_READONLY);
		}
	}
#endif
	ia64_patch_gate();
}
+2 −2
Original line number Diff line number Diff line
@@ -222,7 +222,7 @@ void __init early_sn_setup(void)

extern int platform_intr_list[];
extern nasid_t master_nasid;
static int shub_1_1_found __initdata;
static int __initdata shub_1_1_found = 0;

/*
 * sn_check_for_wars
@@ -251,7 +251,7 @@ static void __init sn_check_for_wars(void)
	} else {
		for_each_online_node(cnode) {
			if (is_shub_1_1(cnodeid_to_nasid(cnode)))
				sn_hub_info->shub_1_1_found = 1;
				shub_1_1_found = 1;
		}
	}
}
Loading