control_code_buffer = start_pgtable + 4096UL; 
control_code_buffer = start_pgtable + PAGE_SIZE; 
NORET_TYPE void machine_kexec(struct kimage *image){	unsigned long page_list;	unsigned long control_code_buffer;	unsigned long start_pgtable;	relocate_new_kernel_t rnk;	/* Interrupts aren't acceptable while we reboot */	local_irq_disable();	/* Calculate the offsets */	page_list = image->head;	start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;	control_code_buffer = start_pgtable + 4096UL;	/* Set the low half of the page table to my identity mapped	 * page table for kexec.  Leave the high half pointing at the	 * kernel pages.   Don't bother to flush the global pages	 * as that will happen when I fully switch to my identity mapped	 * page table anyway.	 */	memcpy(__va(read_cr3()), __va(start_pgtable), PAGE_SIZE/2);	__flush_tlb();	/* The segment registers are funny things, they are	 * automatically loaded from a table, in memory wherever you	 * set them to a specific selector, but this table is never	 * accessed again unless you set the segment to a different selector.	 *	 * The more common model are caches where the behide	 * the scenes work is done, but is also dropped at arbitrary	 * times.	 *	 * I take advantage of this here by force loading the	 * segments, before I zap the gdt with an invalid value.	 */	load_segments();	/* The gdt & idt are now invalid.	 * If you want to load them you must set up your own idt & gdt.	 */	set_gdt(phys_to_virt(0),0);	set_idt(phys_to_virt(0),0);	/* now call it */	rnk = (relocate_new_kernel_t) control_code_buffer;	(*rnk)(page_list, control_code_buffer, image->start, start_pgtable);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/8bf2755664bfe03a414e7ec02d9f16a3d5beb60d/machine_kexec.c/clean/arch/x86_64/kernel/machine_kexec.c