Attach a patch for adding a machine vector notifying the platform
specific code from Jack Steiner. His signature in the attached patch.
The SN prom requires that some internal state be reset prior to kexec'ing
a new kernel.
Add a machine vector notifying the platform-specific code that a kexec
is about to occur. The SN code for this machine vector will issue a SAL call.
Signed-off-by: Jack Steiner <[EMAIL PROTECTED]>
Index: linux/include/asm-ia64/machvec.h
===================================================================
--- linux.orig/include/asm-ia64/machvec.h 2006-10-31 18:44:46.098133313
-0800
+++ linux/include/asm-ia64/machvec.h 2006-10-31 18:47:22.264068143 -0800
@@ -35,6 +35,7 @@ typedef int ia64_mv_pci_legacy_read_t (s
typedef int ia64_mv_pci_legacy_write_t (struct pci_bus *, u16 port, u32 val,
u8 size);
typedef void ia64_mv_migrate_t(struct task_struct * task);
+typedef void ia64_mv_kernel_launch_event_t(void);
/* DMA-mapping interface: */
typedef void ia64_mv_dma_init (void);
@@ -205,6 +206,7 @@ struct ia64_machine_vector {
ia64_mv_readq_relaxed_t *readq_relaxed;
ia64_mv_migrate_t *migrate;
ia64_mv_msi_init_t *msi_init;
+ ia64_mv_kernel_launch_event_t *kernel_launch_event;
} __attribute__((__aligned__(16))); /* align attrib? see above comment */
#define MACHVEC_INIT(name) \
@@ -251,6 +253,7 @@ struct ia64_machine_vector {
platform_readq_relaxed, \
platform_migrate, \
platform_msi_init, \
+ platform_kernel_launch_event, \
}
extern struct ia64_machine_vector ia64_mv;
@@ -303,6 +306,9 @@ extern ia64_mv_dma_supported swiotlb_dm
#ifndef platform_tlb_migrate_finish
# define platform_tlb_migrate_finish machvec_noop_mm
#endif
+#ifndef platform_kernel_launch_event
+# define platform_kernel_launch_event machvec_noop
+#endif
#ifndef platform_dma_init
# define platform_dma_init swiotlb_init
#endif
Index: linux/include/asm-ia64/machvec_sn2.h
===================================================================
--- linux.orig/include/asm-ia64/machvec_sn2.h 2006-10-31 18:44:46.098133313
-0800
+++ linux/include/asm-ia64/machvec_sn2.h 2006-10-31 18:47:22.268068193
-0800
@@ -67,6 +67,7 @@ extern ia64_mv_dma_sync_sg_for_device sn
extern ia64_mv_dma_mapping_error sn_dma_mapping_error;
extern ia64_mv_dma_supported sn_dma_supported;
extern ia64_mv_migrate_t sn_migrate;
+extern ia64_mv_kernel_launch_event_t sn_kernel_launch_event;
extern ia64_mv_msi_init_t sn_msi_init;
@@ -119,6 +120,7 @@ extern ia64_mv_msi_init_t sn_msi_init;
#define platform_dma_mapping_error sn_dma_mapping_error
#define platform_dma_supported sn_dma_supported
#define platform_migrate sn_migrate
+#define platform_kernel_launch_event sn_kernel_launch_event
#ifdef CONFIG_PCI_MSI
#define platform_msi_init sn_msi_init
#else
Index: linux/include/asm-ia64/sn/sn_sal.h
===================================================================
--- linux.orig/include/asm-ia64/sn/sn_sal.h 2006-10-31 18:44:46.098133313
-0800
+++ linux/include/asm-ia64/sn/sn_sal.h 2006-11-07 10:30:01.859754859 -0800
@@ -87,6 +87,8 @@
#define SN_SAL_INJECT_ERROR 0x02000067
#define SN_SAL_SET_CPU_NUMBER 0x02000068
+#define SN_SAL_KERNEL_LAUNCH_EVENT 0x02000069
+
/*
* Service-specific constants
*/
@@ -1154,4 +1156,13 @@ ia64_sn_set_cpu_number(int cpu)
SAL_CALL_NOLOCK(rv, SN_SAL_SET_CPU_NUMBER, cpu, 0, 0, 0, 0, 0, 0);
return rv.status;
}
+
+static inline int
+ia64_sn_kernel_launch_event(void)
+{
+ struct ia64_sal_retval rv;
+
+ SAL_CALL_NOLOCK(rv, SN_SAL_KERNEL_LAUNCH_EVENT, 0, 0, 0, 0, 0, 0, 0);
+ return rv.status;
+}
#endif /* _ASM_IA64_SN_SN_SAL_H */
Index: linux/arch/ia64/sn/kernel/setup.c
===================================================================
--- linux.orig/arch/ia64/sn/kernel/setup.c 2006-10-31 18:44:46.098133313
-0800
+++ linux/arch/ia64/sn/kernel/setup.c 2006-11-07 10:44:30.486080375 -0800
@@ -765,3 +765,11 @@ int sn_prom_feature_available(int id)
}
EXPORT_SYMBOL(sn_prom_feature_available);
+void
+sn_kernel_launch_event(void)
+{
+ /* ignore status until we understand possible failures, if any */
+ if (ia64_sn_kernel_launch_event())
+ printk(KERN_ERR "KEXEC is not supported in this PROM. Please
update the PROM.\n");
+}
+
Index: linux/arch/ia64/kernel/machine_kexec.c
===================================================================
--- linux.orig/arch/ia64/kernel/machine_kexec.c 2006-10-31 18:44:46.110133461
-0800
+++ linux/arch/ia64/kernel/machine_kexec.c 2006-11-07 10:38:36.654033757
-0800
@@ -18,6 +18,7 @@
#include <asm/setup.h>
#include <asm/delay.h>
#include <asm/meminit.h>
+#include <asm/machvec.h>
typedef void (*relocate_new_kernel_t)(unsigned long, unsigned long,
struct ia64_boot_param *, unsigned long);
@@ -125,6 +126,7 @@ static void ia64_machine_kexec(struct un
ia64_eoi();
vector = ia64_get_ivr();
}
+ platform_kernel_launch_event();
rnk = (relocate_new_kernel_t)&code_addr;
(*rnk)(image->head, image->start, ia64_boot_param,
GRANULEROUNDDOWN((unsigned long) pal_addr));
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot