···53#ifdef CONFIG_PPC_MULTIPLATFORM54static void fixup_resource(struct resource *res, struct pci_dev *dev);55static void do_bus_setup(struct pci_bus *bus);056#endif5758/* pci_io_base -- the base address from which io bars are offsets.···252 kfree(phb);253}2540255void __devinit pcibios_claim_one_bus(struct pci_bus *b)256{257 struct pci_dev *dev;···277EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);278#endif279280-#ifndef CONFIG_PPC_ISERIES281static void __init pcibios_claim_of_setup(void)282{283 struct pci_bus *b;···1219}1220EXPORT_SYMBOL(remap_bus_range);12211222-void phbs_remap_io(void)1223{1224 struct pci_controller *hose, *tmp;1225
···53#ifdef CONFIG_PPC_MULTIPLATFORM54static void fixup_resource(struct resource *res, struct pci_dev *dev);55static void do_bus_setup(struct pci_bus *bus);56+static void phbs_remap_io(void);57#endif5859/* pci_io_base -- the base address from which io bars are offsets.···251 kfree(phb);252}253254+#ifndef CONFIG_PPC_ISERIES255void __devinit pcibios_claim_one_bus(struct pci_bus *b)256{257 struct pci_dev *dev;···275EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);276#endif2770278static void __init pcibios_claim_of_setup(void)279{280 struct pci_bus *b;···1218}1219EXPORT_SYMBOL(remap_bus_range);12201221+static void phbs_remap_io(void)1222{1223 struct pci_controller *hose, *tmp;1224
+5-3
arch/powerpc/kernel/process.c
···201}202#endif /* CONFIG_SPE */2030204/*205 * If we are doing lazy switching of CPU state (FP, altivec or SPE),206 * and the current task has some state, discard it.207 */208-static inline void discard_lazy_cpu_state(void)209{210-#ifndef CONFIG_SMP211 preempt_disable();212 if (last_task_used_math == current)213 last_task_used_math = NULL;···220 last_task_used_spe = NULL;221#endif222 preempt_enable();223-#endif /* CONFIG_SMP */224}02250226int set_dabr(unsigned long dabr)227{228 if (ppc_md.set_dabr)···232 mtspr(SPRN_DABR, dabr);233 return 0;234}0235236#ifdef CONFIG_PPC64237DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
···201}202#endif /* CONFIG_SPE */203204+#ifndef CONFIG_SMP205/*206 * If we are doing lazy switching of CPU state (FP, altivec or SPE),207 * and the current task has some state, discard it.208 */209+void discard_lazy_cpu_state(void)210{0211 preempt_disable();212 if (last_task_used_math == current)213 last_task_used_math = NULL;···220 last_task_used_spe = NULL;221#endif222 preempt_enable();0223}224+#endif /* CONFIG_SMP */225226+#ifdef CONFIG_PPC_MERGE /* XXX for now */227int set_dabr(unsigned long dabr)228{229 if (ppc_md.set_dabr)···231 mtspr(SPRN_DABR, dabr);232 return 0;233}234+#endif235236#ifdef CONFIG_PPC64237DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
+24-4
arch/powerpc/kernel/prom.c
···11001101static void __init early_reserve_mem(void)1102{1103- unsigned long base, size;1104- unsigned long *reserve_map;11051106- reserve_map = (unsigned long *)(((unsigned long)initial_boot_params) +1107 initial_boot_params->off_mem_rsvmap);000000000000000000001108 while (1) {1109 base = *(reserve_map++);1110 size = *(reserve_map++);1111 if (size == 0)1112 break;1113- DBG("reserving: %lx -> %lx\n", base, size);1114 lmb_reserve(base, size);1115 }1116
···11001101static void __init early_reserve_mem(void)1102{1103+ u64 base, size;1104+ u64 *reserve_map;11051106+ reserve_map = (u64 *)(((unsigned long)initial_boot_params) +1107 initial_boot_params->off_mem_rsvmap);1108+#ifdef CONFIG_PPC321109+ /* 1110+ * Handle the case where we might be booting from an old kexec1111+ * image that setup the mem_rsvmap as pairs of 32-bit values1112+ */1113+ if (*reserve_map > 0xffffffffull) {1114+ u32 base_32, size_32;1115+ u32 *reserve_map_32 = (u32 *)reserve_map;1116+1117+ while (1) {1118+ base_32 = *(reserve_map_32++);1119+ size_32 = *(reserve_map_32++);1120+ if (size_32 == 0)1121+ break;1122+ DBG("reserving: %lx -> %lx\n", base_32, size_32);1123+ lmb_reserve(base_32, size_32);1124+ }1125+ return;1126+ }1127+#endif1128 while (1) {1129 base = *(reserve_map++);1130 size = *(reserve_map++);1131 if (size == 0)1132 break;1133+ DBG("reserving: %llx -> %llx\n", base, size);1134 lmb_reserve(base, size);1135 }1136
+4-4
arch/powerpc/kernel/prom_init.c
···137};138139struct mem_map_entry {140- unsigned long base;141- unsigned long size;142};143144typedef u32 cell_t;···897 * If problems seem to show up, it would be a good start to track898 * them down.899 */900-static void reserve_mem(unsigned long base, unsigned long size)901{902- unsigned long top = base + size;903 unsigned long cnt = RELOC(mem_reserve_cnt);904905 if (size == 0)
···137};138139struct mem_map_entry {140+ u64 base;141+ u64 size;142};143144typedef u32 cell_t;···897 * If problems seem to show up, it would be a good start to track898 * them down.899 */900+static void reserve_mem(u64 base, u64 size)901{902+ u64 top = base + size;903 unsigned long cnt = RELOC(mem_reserve_cnt);904905 if (size == 0)
+9-12
arch/powerpc/kernel/signal_32.c
···497 if (err)498 return 1;499000000000500 /* force the process to reload the FP registers from501 current->thread when it next does FP instructions */502 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);···547 return 1;548#endif /* CONFIG_SPE */549550-#ifndef CONFIG_SMP551- preempt_disable();552- if (last_task_used_math == current)553- last_task_used_math = NULL;554- if (last_task_used_altivec == current)555- last_task_used_altivec = NULL;556-#ifdef CONFIG_SPE557- if (last_task_used_spe == current)558- last_task_used_spe = NULL;559-#endif560- preempt_enable();561-#endif562 return 0;563}564
···497 if (err)498 return 1;499500+ /*501+ * Do this before updating the thread state in502+ * current->thread.fpr/vr/evr. That way, if we get preempted503+ * and another task grabs the FPU/Altivec/SPE, it won't be504+ * tempted to save the current CPU state into the thread_struct505+ * and corrupt what we are writing there.506+ */507+ discard_lazy_cpu_state();508+509 /* force the process to reload the FP registers from510 current->thread when it next does FP instructions */511 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);···538 return 1;539#endif /* CONFIG_SPE */540000000000000541 return 0;542}543
···207208 if (!sig)209 regs->gpr[13] = save_r13;0210 if (set != NULL)211 err |= __get_user(set->sig[0], &sc->oldmask);212+213+ /*214+ * Do this before updating the thread state in215+ * current->thread.fpr/vr. That way, if we get preempted216+ * and another task grabs the FPU/Altivec, it won't be217+ * tempted to save the current CPU state into the thread_struct218+ * and corrupt what we are writing there.219+ */220+ discard_lazy_cpu_state();221+222+ err |= __copy_from_user(¤t->thread.fpr, &sc->fp_regs, FP_REGS_SIZE);223224#ifdef CONFIG_ALTIVEC225 err |= __get_user(v_regs, &sc->v_regs);···229 current->thread.vrsave = 0;230#endif /* CONFIG_ALTIVEC */23100000000232 /* Force reload of FP/VEC */233 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1 | MSR_VEC);234
···29 * value of the spu_status register after the SPU has stopped.30 *31 */32-long do_spu_run(struct file *filp, __u32 __user *unpc, __u32 __user *ustatus)0033{34 long ret;35 struct spufs_inode_info *i;
···29 * value of the spu_status register after the SPU has stopped.30 *31 */32+static long do_spu_run(struct file *filp,33+ __u32 __user *unpc,34+ __u32 __user *ustatus)35{36 long ret;37 struct spufs_inode_info *i;
···1+#ifndef _PLATFORMS_ISERIES_IOMMU_H2+#define _PLATFORMS_ISERIES_IOMMU_H3+4+/*5+ * Copyright (C) 2005 Stephen Rothwell, IBM Corporation6+ *7+ * This program is free software; you can redistribute it and/or modify8+ * it under the terms of the GNU General Public License as published by9+ * the Free Software Foundation; either version 2 of the License, or10+ * (at your option) any later version.11+ *12+ * This program is distributed in the hope that it will be useful,13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15+ * GNU General Public License for more details.16+ *17+ * You should have received a copy of the GNU General Public License18+ * along with this program; if not, write to the:19+ * Free Software Foundation, Inc.,20+ * 59 Temple Place, Suite 330,21+ * Boston, MA 02111-1307 USA22+ */23+24+struct device_node;25+struct iommu_table;26+27+/* Creates table for an individual device node */28+extern void iommu_devnode_init_iSeries(struct device_node *dn);29+30+/* Get table parameters from HV */31+extern void iommu_table_getparms_iSeries(unsigned long busno,32+ unsigned char slotno, unsigned char virtbus,33+ struct iommu_table *tbl);34+35+#endif /* _PLATFORMS_ISERIES_IOMMU_H */
+8-11
arch/powerpc/platforms/iseries/irq.c
···48extern void iSeries_smp_message_recv(struct pt_regs *);49#endif500051enum pci_event_type {52 pe_bus_created = 0, /* PHB has been created */53 pe_bus_error = 1, /* PHB has failed */···149static void pci_event_handler(struct HvLpEvent *event, struct pt_regs *regs)150{151 if (event && (event->xType == HvLpEvent_Type_PciIo)) {152- switch (event->xFlags.xFunction) {153- case HvLpEvent_Function_Int:154 int_received((struct pci_event *)event, regs);155- break;156- case HvLpEvent_Function_Ack:157 printk(KERN_ERR158 "pci_event_handler: unexpected ack received\n");159- break;160- default:161- printk(KERN_ERR162- "pci_event_handler: unexpected event function %d\n",163- (int)event->xFlags.xFunction);164- break;165- }166 } else if (event)167 printk(KERN_ERR168 "pci_event_handler: Unrecognized PCI event type 0x%x\n",···327 return virtirq;328}32900330/*331 * Get the next pending IRQ.332 */···348 if (hvlpevent_is_pending())349 process_hvlpevents(regs);3500351 if (num_pending_irqs) {352 spin_lock(&pending_irqs_lock);353 for (irq = 0; irq < NR_IRQS; irq++) {···362 if (irq >= NR_IRQS)363 irq = -2;364 }0365366 return irq;367}
···48extern void iSeries_smp_message_recv(struct pt_regs *);49#endif5051+#ifdef CONFIG_PCI52+53enum pci_event_type {54 pe_bus_created = 0, /* PHB has been created */55 pe_bus_error = 1, /* PHB has failed */···147static void pci_event_handler(struct HvLpEvent *event, struct pt_regs *regs)148{149 if (event && (event->xType == HvLpEvent_Type_PciIo)) {150+ if (hvlpevent_is_int(event))0151 int_received((struct pci_event *)event, regs);152+ else0153 printk(KERN_ERR154 "pci_event_handler: unexpected ack received\n");0000000155 } else if (event)156 printk(KERN_ERR157 "pci_event_handler: Unrecognized PCI event type 0x%x\n",···334 return virtirq;335}336337+#endif /* CONFIG_PCI */338+339/*340 * Get the next pending IRQ.341 */···353 if (hvlpevent_is_pending())354 process_hvlpevents(regs);355356+#ifdef CONFIG_PCI357 if (num_pending_irqs) {358 spin_lock(&pending_irqs_lock);359 for (irq = 0; irq < NR_IRQS; irq++) {···366 if (irq >= NR_IRQS)367 irq = -2;368 }369+#endif370371 return irq;372}
···270 * First see if this is just a normal monitor message from the271 * other partition272 */273- if (event->xFlags.xFunction == HvLpEvent_Function_Int) {274 remoteLp = event->xSourceLp;275 if (!viopathStatus[remoteLp].isActive)276 sendMonMsg(remoteLp);···331{332 if (!event)333 return;334- if (event->xFlags.xFunction == HvLpEvent_Function_Int) {335 printk(VIOPATH_KERN_WARN336 "unexpected config request from partition %d",337 event->xSourceLp);338339- if ((event->xFlags.xFunction == HvLpEvent_Function_Int) &&340- (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck)) {341 event->xRc = HvLpEvent_Rc_InvalidSubtype;342 HvCallEvent_ackLpEvent(event);343 }···376 int subtype = (event->xSubtype & VIOMAJOR_SUBTYPE_MASK)377 >> VIOMAJOR_SUBTYPE_SHIFT;378379- if (event->xFlags.xFunction == HvLpEvent_Function_Int) {380 remoteLp = event->xSourceLp;381 /*382 * The isActive is checked because if the hosting partition···435 "unexpected virtual io event subtype %d from partition %d\n",436 event->xSubtype, remoteLp);437 /* No handler. Ack if necessary */438- if ((event->xFlags.xFunction == HvLpEvent_Function_Int) &&439- (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck)) {440 event->xRc = HvLpEvent_Rc_InvalidSubtype;441 HvCallEvent_ackLpEvent(event);442 }
···270 * First see if this is just a normal monitor message from the271 * other partition272 */273+ if (hvlpevent_is_int(event)) {274 remoteLp = event->xSourceLp;275 if (!viopathStatus[remoteLp].isActive)276 sendMonMsg(remoteLp);···331{332 if (!event)333 return;334+ if (hvlpevent_is_int(event)) {335 printk(VIOPATH_KERN_WARN336 "unexpected config request from partition %d",337 event->xSourceLp);338339+ if (hvlpevent_need_ack(event)) {0340 event->xRc = HvLpEvent_Rc_InvalidSubtype;341 HvCallEvent_ackLpEvent(event);342 }···377 int subtype = (event->xSubtype & VIOMAJOR_SUBTYPE_MASK)378 >> VIOMAJOR_SUBTYPE_SHIFT;379380+ if (hvlpevent_is_int(event)) {381 remoteLp = event->xSourceLp;382 /*383 * The isActive is checked because if the hosting partition···436 "unexpected virtual io event subtype %d from partition %d\n",437 event->xSubtype, remoteLp);438 /* No handler. Ack if necessary */439+ if (hvlpevent_is_int(event) && hvlpevent_need_ack(event)) {0440 event->xRc = HvLpEvent_Rc_InvalidSubtype;441 HvCallEvent_ackLpEvent(event);442 }
+1-1
arch/powerpc/platforms/powermac/setup.c
···278}279#endif280281-void __init pmac_setup_arch(void)282{283 struct device_node *cpu, *ic;284 int *fp;
···278}279#endif280281+static void __init pmac_setup_arch(void)282{283 struct device_node *cpu, *ic;284 int *fp;
+3-2
arch/powerpc/platforms/pseries/eeh.c
···208{209 while (dn) {210 if (PCI_DN(dn)) {211- PCI_DN(dn)->eeh_mode |= mode_flag;212-213 /* Mark the pci device driver too */214 struct pci_dev *dev = PCI_DN(dn)->pcidev;000215 if (dev && dev->driver)216 dev->error_state = pci_channel_io_frozen;217
···208{209 while (dn) {210 if (PCI_DN(dn)) {00211 /* Mark the pci device driver too */212 struct pci_dev *dev = PCI_DN(dn)->pcidev;213+214+ PCI_DN(dn)->eeh_mode |= mode_flag;215+216 if (dev && dev->driver)217 dev->error_state = pci_channel_io_frozen;218
+2-2
arch/powerpc/platforms/pseries/hvcserver.c
···40 * functions aren't performance sensitive, so this conversion isn't an41 * issue.42 */43-int hvcs_convert(long to_convert)44{45 switch (to_convert) {46 case H_Success:···91EXPORT_SYMBOL(hvcs_free_partner_info);9293/* Helper function for hvcs_get_partner_info */94-int hvcs_next_partner(uint32_t unit_address,95 unsigned long last_p_partition_ID,96 unsigned long last_p_unit_address, unsigned long *pi_buff)97
···40 * functions aren't performance sensitive, so this conversion isn't an41 * issue.42 */43+static int hvcs_convert(long to_convert)44{45 switch (to_convert) {46 case H_Success:···91EXPORT_SYMBOL(hvcs_free_partner_info);9293/* Helper function for hvcs_get_partner_info */94+static int hvcs_next_partner(uint32_t unit_address,95 unsigned long last_p_partition_ID,96 unsigned long last_p_unit_address, unsigned long *pi_buff)97
-2
arch/powerpc/platforms/pseries/iommu.c
···5152#define DBG(fmt...)5354-extern int is_python(struct device_node *);55-56static void tce_build_pSeries(struct iommu_table *tbl, long index, 57 long npages, unsigned long uaddr, 58 enum dma_data_direction direction)
···5152#define DBG(fmt...)530054static void tce_build_pSeries(struct iommu_table *tbl, long index, 55 long npages, unsigned long uaddr, 56 enum dma_data_direction direction)
···93 return cpu_status;94}9596-int pSeries_cpu_disable(void)97{98 int cpu = smp_processor_id();99···109 return 0;110}111112-void pSeries_cpu_die(unsigned int cpu)113{114 int tries;115 int cpu_status;
···93 return cpu_status;94}9596+static int pSeries_cpu_disable(void)97{98 int cpu = smp_processor_id();99···109 return 0;110}111112+static void pSeries_cpu_die(unsigned int cpu)113{114 int tries;115 int cpu_status;
+1-1
arch/powerpc/platforms/pseries/xics.c
···381382#ifdef CONFIG_SMP383384-irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)385{386 int cpu = smp_processor_id();387
···381382#ifdef CONFIG_SMP383384+static irqreturn_t xics_ipi_action(int irq, void *dev_id, struct pt_regs *regs)385{386 int cpu = smp_processor_id();387
···1-/*2- * arch/ppc/kernel/process.c3- *4- * Derived from "arch/i386/kernel/process.c"5- * Copyright (C) 1995 Linus Torvalds6- *7- * Updated and modified by Cort Dougan (cort@cs.nmt.edu) and8- * Paul Mackerras (paulus@cs.anu.edu.au)9- *10- * PowerPC version11- * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)12- *13- * This program is free software; you can redistribute it and/or14- * modify it under the terms of the GNU General Public License15- * as published by the Free Software Foundation; either version16- * 2 of the License, or (at your option) any later version.17- *18- */19-20-#include <linux/config.h>21-#include <linux/errno.h>22-#include <linux/sched.h>23-#include <linux/kernel.h>24-#include <linux/mm.h>25-#include <linux/smp.h>26-#include <linux/smp_lock.h>27-#include <linux/stddef.h>28-#include <linux/unistd.h>29-#include <linux/ptrace.h>30-#include <linux/slab.h>31-#include <linux/user.h>32-#include <linux/elf.h>33-#include <linux/init.h>34-#include <linux/prctl.h>35-#include <linux/init_task.h>36-#include <linux/module.h>37-#include <linux/kallsyms.h>38-#include <linux/mqueue.h>39-#include <linux/hardirq.h>40-41-#include <asm/pgtable.h>42-#include <asm/uaccess.h>43-#include <asm/system.h>44-#include <asm/io.h>45-#include <asm/processor.h>46-#include <asm/mmu.h>47-#include <asm/prom.h>48-49-extern unsigned long _get_SP(void);50-51-struct task_struct *last_task_used_math = NULL;52-struct task_struct *last_task_used_altivec = NULL;53-struct task_struct *last_task_used_spe = NULL;54-55-static struct fs_struct init_fs = INIT_FS;56-static struct files_struct init_files = INIT_FILES;57-static struct signal_struct init_signals = INIT_SIGNALS(init_signals);58-static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);59-struct mm_struct init_mm = INIT_MM(init_mm);60-EXPORT_SYMBOL(init_mm);61-62-/* this is 8kB-aligned so we can get to the thread_info struct63- at the base of it from the stack pointer with 1 integer instruction. */64-union thread_union init_thread_union65- __attribute__((__section__(".data.init_task"))) =66-{ INIT_THREAD_INFO(init_task) };67-68-/* initial task structure */69-struct task_struct init_task = INIT_TASK(init_task);70-EXPORT_SYMBOL(init_task);71-72-/* only used to get secondary processor up */73-struct task_struct *current_set[NR_CPUS] = {&init_task, };74-75-#undef SHOW_TASK_SWITCHES76-#undef CHECK_STACK77-78-#if defined(CHECK_STACK)79-unsigned long80-kernel_stack_top(struct task_struct *tsk)81-{82- return ((unsigned long)tsk) + sizeof(union task_union);83-}84-85-unsigned long86-task_top(struct task_struct *tsk)87-{88- return ((unsigned long)tsk) + sizeof(struct thread_info);89-}90-91-/* check to make sure the kernel stack is healthy */92-int check_stack(struct task_struct *tsk)93-{94- unsigned long stack_top = kernel_stack_top(tsk);95- unsigned long tsk_top = task_top(tsk);96- int ret = 0;97-98-#if 099- /* check thread magic */100- if ( tsk->thread.magic != THREAD_MAGIC )101- {102- ret |= 1;103- printk("thread.magic bad: %08x\n", tsk->thread.magic);104- }105-#endif106-107- if ( !tsk )108- printk("check_stack(): tsk bad tsk %p\n",tsk);109-110- /* check if stored ksp is bad */111- if ( (tsk->thread.ksp > stack_top) || (tsk->thread.ksp < tsk_top) )112- {113- printk("stack out of bounds: %s/%d\n"114- " tsk_top %08lx ksp %08lx stack_top %08lx\n",115- tsk->comm,tsk->pid,116- tsk_top, tsk->thread.ksp, stack_top);117- ret |= 2;118- }119-120- /* check if stack ptr RIGHT NOW is bad */121- if ( (tsk == current) && ((_get_SP() > stack_top ) || (_get_SP() < tsk_top)) )122- {123- printk("current stack ptr out of bounds: %s/%d\n"124- " tsk_top %08lx sp %08lx stack_top %08lx\n",125- current->comm,current->pid,126- tsk_top, _get_SP(), stack_top);127- ret |= 4;128- }129-130-#if 0131- /* check amount of free stack */132- for ( i = (unsigned long *)task_top(tsk) ; i < kernel_stack_top(tsk) ; i++ )133- {134- if ( !i )135- printk("check_stack(): i = %p\n", i);136- if ( *i != 0 )137- {138- /* only notify if it's less than 900 bytes */139- if ( (i - (unsigned long *)task_top(tsk)) < 900 )140- printk("%d bytes free on stack\n",141- i - task_top(tsk));142- break;143- }144- }145-#endif146-147- if (ret)148- {149- panic("bad kernel stack");150- }151- return(ret);152-}153-#endif /* defined(CHECK_STACK) */154-155-/*156- * Make sure the floating-point register state in the157- * the thread_struct is up to date for task tsk.158- */159-void flush_fp_to_thread(struct task_struct *tsk)160-{161- if (tsk->thread.regs) {162- /*163- * We need to disable preemption here because if we didn't,164- * another process could get scheduled after the regs->msr165- * test but before we have finished saving the FP registers166- * to the thread_struct. That process could take over the167- * FPU, and then when we get scheduled again we would store168- * bogus values for the remaining FP registers.169- */170- preempt_disable();171- if (tsk->thread.regs->msr & MSR_FP) {172-#ifdef CONFIG_SMP173- /*174- * This should only ever be called for current or175- * for a stopped child process. Since we save away176- * the FP register state on context switch on SMP,177- * there is something wrong if a stopped child appears178- * to still have its FP state in the CPU registers.179- */180- BUG_ON(tsk != current);181-#endif182- giveup_fpu(current);183- }184- preempt_enable();185- }186-}187-188-void enable_kernel_fp(void)189-{190- WARN_ON(preemptible());191-192-#ifdef CONFIG_SMP193- if (current->thread.regs && (current->thread.regs->msr & MSR_FP))194- giveup_fpu(current);195- else196- giveup_fpu(NULL); /* just enables FP for kernel */197-#else198- giveup_fpu(last_task_used_math);199-#endif /* CONFIG_SMP */200-}201-EXPORT_SYMBOL(enable_kernel_fp);202-203-int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs)204-{205- preempt_disable();206- if (tsk->thread.regs && (tsk->thread.regs->msr & MSR_FP))207- giveup_fpu(tsk);208- preempt_enable();209- memcpy(fpregs, &tsk->thread.fpr[0], sizeof(*fpregs));210- return 1;211-}212-213-#ifdef CONFIG_ALTIVEC214-void enable_kernel_altivec(void)215-{216- WARN_ON(preemptible());217-218-#ifdef CONFIG_SMP219- if (current->thread.regs && (current->thread.regs->msr & MSR_VEC))220- giveup_altivec(current);221- else222- giveup_altivec(NULL); /* just enable AltiVec for kernel - force */223-#else224- giveup_altivec(last_task_used_altivec);225-#endif /* __SMP __ */226-}227-EXPORT_SYMBOL(enable_kernel_altivec);228-229-/*230- * Make sure the VMX/Altivec register state in the231- * the thread_struct is up to date for task tsk.232- */233-void flush_altivec_to_thread(struct task_struct *tsk)234-{235- if (tsk->thread.regs) {236- preempt_disable();237- if (tsk->thread.regs->msr & MSR_VEC) {238-#ifdef CONFIG_SMP239- BUG_ON(tsk != current);240-#endif241- giveup_altivec(current);242- }243- preempt_enable();244- }245-}246-247-int dump_altivec(struct pt_regs *regs, elf_vrregset_t *vrregs)248-{249- if (regs->msr & MSR_VEC)250- giveup_altivec(current);251- memcpy(vrregs, ¤t->thread.vr[0], sizeof(*vrregs));252- return 1;253-}254-#endif /* CONFIG_ALTIVEC */255-256-#ifdef CONFIG_SPE257-void258-enable_kernel_spe(void)259-{260- WARN_ON(preemptible());261-262-#ifdef CONFIG_SMP263- if (current->thread.regs && (current->thread.regs->msr & MSR_SPE))264- giveup_spe(current);265- else266- giveup_spe(NULL); /* just enable SPE for kernel - force */267-#else268- giveup_spe(last_task_used_spe);269-#endif /* __SMP __ */270-}271-EXPORT_SYMBOL(enable_kernel_spe);272-273-void flush_spe_to_thread(struct task_struct *tsk)274-{275- if (tsk->thread.regs) {276- preempt_disable();277- if (tsk->thread.regs->msr & MSR_SPE) {278-#ifdef CONFIG_SMP279- BUG_ON(tsk != current);280-#endif281- giveup_spe(current);282- }283- preempt_enable();284- }285-}286-287-int dump_spe(struct pt_regs *regs, elf_vrregset_t *evrregs)288-{289- if (regs->msr & MSR_SPE)290- giveup_spe(current);291- /* We copy u32 evr[32] + u64 acc + u32 spefscr -> 35 */292- memcpy(evrregs, ¤t->thread.evr[0], sizeof(u32) * 35);293- return 1;294-}295-#endif /* CONFIG_SPE */296-297-struct task_struct *__switch_to(struct task_struct *prev,298- struct task_struct *new)299-{300- struct thread_struct *new_thread, *old_thread;301- unsigned long s;302- struct task_struct *last;303-304- local_irq_save(s);305-#ifdef CHECK_STACK306- check_stack(prev);307- check_stack(new);308-#endif309-310-#ifdef CONFIG_SMP311- /* avoid complexity of lazy save/restore of fpu312- * by just saving it every time we switch out if313- * this task used the fpu during the last quantum.314- *315- * If it tries to use the fpu again, it'll trap and316- * reload its fp regs. So we don't have to do a restore317- * every switch, just a save.318- * -- Cort319- */320- if (prev->thread.regs && (prev->thread.regs->msr & MSR_FP))321- giveup_fpu(prev);322-#ifdef CONFIG_ALTIVEC323- /*324- * If the previous thread used altivec in the last quantum325- * (thus changing altivec regs) then save them.326- * We used to check the VRSAVE register but not all apps327- * set it, so we don't rely on it now (and in fact we need328- * to save & restore VSCR even if VRSAVE == 0). -- paulus329- *330- * On SMP we always save/restore altivec regs just to avoid the331- * complexity of changing processors.332- * -- Cort333- */334- if ((prev->thread.regs && (prev->thread.regs->msr & MSR_VEC)))335- giveup_altivec(prev);336-#endif /* CONFIG_ALTIVEC */337-#ifdef CONFIG_SPE338- /*339- * If the previous thread used spe in the last quantum340- * (thus changing spe regs) then save them.341- *342- * On SMP we always save/restore spe regs just to avoid the343- * complexity of changing processors.344- */345- if ((prev->thread.regs && (prev->thread.regs->msr & MSR_SPE)))346- giveup_spe(prev);347-#endif /* CONFIG_SPE */348-#endif /* CONFIG_SMP */349-350-#ifdef CONFIG_ALTIVEC351- /* Avoid the trap. On smp this this never happens since352- * we don't set last_task_used_altivec -- Cort353- */354- if (new->thread.regs && last_task_used_altivec == new)355- new->thread.regs->msr |= MSR_VEC;356-#endif357-#ifdef CONFIG_SPE358- /* Avoid the trap. On smp this this never happens since359- * we don't set last_task_used_spe360- */361- if (new->thread.regs && last_task_used_spe == new)362- new->thread.regs->msr |= MSR_SPE;363-#endif /* CONFIG_SPE */364- new_thread = &new->thread;365- old_thread = ¤t->thread;366- last = _switch(old_thread, new_thread);367- local_irq_restore(s);368- return last;369-}370-371-void show_regs(struct pt_regs * regs)372-{373- int i, trap;374-375- printk("NIP: %08lX LR: %08lX SP: %08lX REGS: %p TRAP: %04lx %s\n",376- regs->nip, regs->link, regs->gpr[1], regs, regs->trap,377- print_tainted());378- printk("MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n",379- regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0,380- regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0,381- regs->msr&MSR_IR ? 1 : 0,382- regs->msr&MSR_DR ? 1 : 0);383- trap = TRAP(regs);384- if (trap == 0x300 || trap == 0x600)385- printk("DAR: %08lX, DSISR: %08lX\n", regs->dar, regs->dsisr);386- printk("TASK = %p[%d] '%s' THREAD: %p\n",387- current, current->pid, current->comm, task_thread_info(current));388- printk("Last syscall: %ld ", current->thread.last_syscall);389-390-#ifdef CONFIG_SMP391- printk(" CPU: %d", smp_processor_id());392-#endif /* CONFIG_SMP */393-394- for (i = 0; i < 32; i++) {395- long r;396- if ((i % 8) == 0)397- printk("\n" KERN_INFO "GPR%02d: ", i);398- if (__get_user(r, ®s->gpr[i]))399- break;400- printk("%08lX ", r);401- if (i == 12 && !FULL_REGS(regs))402- break;403- }404- printk("\n");405-#ifdef CONFIG_KALLSYMS406- /*407- * Lookup NIP late so we have the best change of getting the408- * above info out without failing409- */410- printk("NIP [%08lx] ", regs->nip);411- print_symbol("%s\n", regs->nip);412- printk("LR [%08lx] ", regs->link);413- print_symbol("%s\n", regs->link);414-#endif415- show_stack(current, (unsigned long *) regs->gpr[1]);416-}417-418-void exit_thread(void)419-{420- preempt_disable();421- if (last_task_used_math == current)422- last_task_used_math = NULL;423- if (last_task_used_altivec == current)424- last_task_used_altivec = NULL;425-#ifdef CONFIG_SPE426- if (last_task_used_spe == current)427- last_task_used_spe = NULL;428-#endif429- preempt_enable();430-}431-432-void flush_thread(void)433-{434- preempt_disable();435- if (last_task_used_math == current)436- last_task_used_math = NULL;437- if (last_task_used_altivec == current)438- last_task_used_altivec = NULL;439-#ifdef CONFIG_SPE440- if (last_task_used_spe == current)441- last_task_used_spe = NULL;442-#endif443- preempt_enable();444-}445-446-void447-release_thread(struct task_struct *t)448-{449-}450-451-/*452- * This gets called before we allocate a new thread and copy453- * the current task into it.454- */455-void prepare_to_copy(struct task_struct *tsk)456-{457- struct pt_regs *regs = tsk->thread.regs;458-459- if (regs == NULL)460- return;461- preempt_disable();462- if (regs->msr & MSR_FP)463- giveup_fpu(current);464-#ifdef CONFIG_ALTIVEC465- if (regs->msr & MSR_VEC)466- giveup_altivec(current);467-#endif /* CONFIG_ALTIVEC */468-#ifdef CONFIG_SPE469- if (regs->msr & MSR_SPE)470- giveup_spe(current);471-#endif /* CONFIG_SPE */472- preempt_enable();473-}474-475-/*476- * Copy a thread..477- */478-int479-copy_thread(int nr, unsigned long clone_flags, unsigned long usp,480- unsigned long unused,481- struct task_struct *p, struct pt_regs *regs)482-{483- struct pt_regs *childregs, *kregs;484- extern void ret_from_fork(void);485- unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;486- unsigned long childframe;487-488- CHECK_FULL_REGS(regs);489- /* Copy registers */490- sp -= sizeof(struct pt_regs);491- childregs = (struct pt_regs *) sp;492- *childregs = *regs;493- if ((childregs->msr & MSR_PR) == 0) {494- /* for kernel thread, set `current' and stackptr in new task */495- childregs->gpr[1] = sp + sizeof(struct pt_regs);496- childregs->gpr[2] = (unsigned long) p;497- p->thread.regs = NULL; /* no user register state */498- } else {499- childregs->gpr[1] = usp;500- p->thread.regs = childregs;501- if (clone_flags & CLONE_SETTLS)502- childregs->gpr[2] = childregs->gpr[6];503- }504- childregs->gpr[3] = 0; /* Result from fork() */505- sp -= STACK_FRAME_OVERHEAD;506- childframe = sp;507-508- /*509- * The way this works is that at some point in the future510- * some task will call _switch to switch to the new task.511- * That will pop off the stack frame created below and start512- * the new task running at ret_from_fork. The new task will513- * do some house keeping and then return from the fork or clone514- * system call, using the stack frame created above.515- */516- sp -= sizeof(struct pt_regs);517- kregs = (struct pt_regs *) sp;518- sp -= STACK_FRAME_OVERHEAD;519- p->thread.ksp = sp;520- kregs->nip = (unsigned long)ret_from_fork;521-522- p->thread.last_syscall = -1;523-524- return 0;525-}526-527-/*528- * Set up a thread for executing a new program529- */530-void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp)531-{532- set_fs(USER_DS);533- memset(regs->gpr, 0, sizeof(regs->gpr));534- regs->ctr = 0;535- regs->link = 0;536- regs->xer = 0;537- regs->ccr = 0;538- regs->mq = 0;539- regs->nip = nip;540- regs->gpr[1] = sp;541- regs->msr = MSR_USER;542- preempt_disable();543- if (last_task_used_math == current)544- last_task_used_math = NULL;545- if (last_task_used_altivec == current)546- last_task_used_altivec = NULL;547-#ifdef CONFIG_SPE548- if (last_task_used_spe == current)549- last_task_used_spe = NULL;550-#endif551- preempt_enable();552- memset(current->thread.fpr, 0, sizeof(current->thread.fpr));553- current->thread.fpscr.val = 0;554-#ifdef CONFIG_ALTIVEC555- memset(current->thread.vr, 0, sizeof(current->thread.vr));556- memset(¤t->thread.vscr, 0, sizeof(current->thread.vscr));557- current->thread.vrsave = 0;558- current->thread.used_vr = 0;559-#endif /* CONFIG_ALTIVEC */560-#ifdef CONFIG_SPE561- memset(current->thread.evr, 0, sizeof(current->thread.evr));562- current->thread.acc = 0;563- current->thread.spefscr = 0;564- current->thread.used_spe = 0;565-#endif /* CONFIG_SPE */566-}567-568-#define PR_FP_ALL_EXCEPT (PR_FP_EXC_DIV | PR_FP_EXC_OVF | PR_FP_EXC_UND \569- | PR_FP_EXC_RES | PR_FP_EXC_INV)570-571-int set_fpexc_mode(struct task_struct *tsk, unsigned int val)572-{573- struct pt_regs *regs = tsk->thread.regs;574-575- /* This is a bit hairy. If we are an SPE enabled processor576- * (have embedded fp) we store the IEEE exception enable flags in577- * fpexc_mode. fpexc_mode is also used for setting FP exception578- * mode (asyn, precise, disabled) for 'Classic' FP. */579- if (val & PR_FP_EXC_SW_ENABLE) {580-#ifdef CONFIG_SPE581- tsk->thread.fpexc_mode = val &582- (PR_FP_EXC_SW_ENABLE | PR_FP_ALL_EXCEPT);583-#else584- return -EINVAL;585-#endif586- } else {587- /* on a CONFIG_SPE this does not hurt us. The bits that588- * __pack_fe01 use do not overlap with bits used for589- * PR_FP_EXC_SW_ENABLE. Additionally, the MSR[FE0,FE1] bits590- * on CONFIG_SPE implementations are reserved so writing to591- * them does not change anything */592- if (val > PR_FP_EXC_PRECISE)593- return -EINVAL;594- tsk->thread.fpexc_mode = __pack_fe01(val);595- if (regs != NULL && (regs->msr & MSR_FP) != 0)596- regs->msr = (regs->msr & ~(MSR_FE0|MSR_FE1))597- | tsk->thread.fpexc_mode;598- }599- return 0;600-}601-602-int get_fpexc_mode(struct task_struct *tsk, unsigned long adr)603-{604- unsigned int val;605-606- if (tsk->thread.fpexc_mode & PR_FP_EXC_SW_ENABLE)607-#ifdef CONFIG_SPE608- val = tsk->thread.fpexc_mode;609-#else610- return -EINVAL;611-#endif612- else613- val = __unpack_fe01(tsk->thread.fpexc_mode);614- return put_user(val, (unsigned int __user *) adr);615-}616-617-int sys_clone(unsigned long clone_flags, unsigned long usp,618- int __user *parent_tidp, void __user *child_threadptr,619- int __user *child_tidp, int p6,620- struct pt_regs *regs)621-{622- CHECK_FULL_REGS(regs);623- if (usp == 0)624- usp = regs->gpr[1]; /* stack pointer for child */625- return do_fork(clone_flags, usp, regs, 0, parent_tidp, child_tidp);626-}627-628-int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3,629- unsigned long p4, unsigned long p5, unsigned long p6,630- struct pt_regs *regs)631-{632- CHECK_FULL_REGS(regs);633- return do_fork(SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL);634-}635-636-int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,637- unsigned long p4, unsigned long p5, unsigned long p6,638- struct pt_regs *regs)639-{640- CHECK_FULL_REGS(regs);641- return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gpr[1],642- regs, 0, NULL, NULL);643-}644-645-int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,646- unsigned long a3, unsigned long a4, unsigned long a5,647- struct pt_regs *regs)648-{649- int error;650- char * filename;651-652- filename = getname((char __user *) a0);653- error = PTR_ERR(filename);654- if (IS_ERR(filename))655- goto out;656- preempt_disable();657- if (regs->msr & MSR_FP)658- giveup_fpu(current);659-#ifdef CONFIG_ALTIVEC660- if (regs->msr & MSR_VEC)661- giveup_altivec(current);662-#endif /* CONFIG_ALTIVEC */663-#ifdef CONFIG_SPE664- if (regs->msr & MSR_SPE)665- giveup_spe(current);666-#endif /* CONFIG_SPE */667- preempt_enable();668- error = do_execve(filename, (char __user *__user *) a1,669- (char __user *__user *) a2, regs);670- if (error == 0) {671- task_lock(current);672- current->ptrace &= ~PT_DTRACE;673- task_unlock(current);674- }675- putname(filename);676-out:677- return error;678-}679-680-void dump_stack(void)681-{682- show_stack(current, NULL);683-}684-685-EXPORT_SYMBOL(dump_stack);686-687-void show_stack(struct task_struct *tsk, unsigned long *stack)688-{689- unsigned long sp, stack_top, prev_sp, ret;690- int count = 0;691- unsigned long next_exc = 0;692- struct pt_regs *regs;693- extern char ret_from_except, ret_from_except_full, ret_from_syscall;694-695- sp = (unsigned long) stack;696- if (tsk == NULL)697- tsk = current;698- if (sp == 0) {699- if (tsk == current)700- asm("mr %0,1" : "=r" (sp));701- else702- sp = tsk->thread.ksp;703- }704-705- prev_sp = (unsigned long) end_of_stack(tsk);706- stack_top = (unsigned long) task_stack_page(tsk) + THREAD_SIZE;707- while (count < 16 && sp > prev_sp && sp < stack_top && (sp & 3) == 0) {708- if (count == 0) {709- printk("Call trace:");710-#ifdef CONFIG_KALLSYMS711- printk("\n");712-#endif713- } else {714- if (next_exc) {715- ret = next_exc;716- next_exc = 0;717- } else718- ret = *(unsigned long *)(sp + 4);719- printk(" [%08lx] ", ret);720-#ifdef CONFIG_KALLSYMS721- print_symbol("%s", ret);722- printk("\n");723-#endif724- if (ret == (unsigned long) &ret_from_except725- || ret == (unsigned long) &ret_from_except_full726- || ret == (unsigned long) &ret_from_syscall) {727- /* sp + 16 points to an exception frame */728- regs = (struct pt_regs *) (sp + 16);729- if (sp + 16 + sizeof(*regs) <= stack_top)730- next_exc = regs->nip;731- }732- }733- ++count;734- sp = *(unsigned long *)sp;735- }736-#ifndef CONFIG_KALLSYMS737- if (count > 0)738- printk("\n");739-#endif740-}741-742-#if 0743-/*744- * Low level print for debugging - Cort745- */746-int __init ll_printk(const char *fmt, ...)747-{748- va_list args;749- char buf[256];750- int i;751-752- va_start(args, fmt);753- i=vsprintf(buf,fmt,args);754- ll_puts(buf);755- va_end(args);756- return i;757-}758-759-int lines = 24, cols = 80;760-int orig_x = 0, orig_y = 0;761-762-void puthex(unsigned long val)763-{764- unsigned char buf[10];765- int i;766- for (i = 7; i >= 0; i--)767- {768- buf[i] = "0123456789ABCDEF"[val & 0x0F];769- val >>= 4;770- }771- buf[8] = '\0';772- prom_print(buf);773-}774-775-void __init ll_puts(const char *s)776-{777- int x,y;778- char *vidmem = (char *)/*(_ISA_MEM_BASE + 0xB8000) */0xD00B8000;779- char c;780- extern int mem_init_done;781-782- if ( mem_init_done ) /* assume this means we can printk */783- {784- printk(s);785- return;786- }787-788-#if 0789- if ( have_of )790- {791- prom_print(s);792- return;793- }794-#endif795-796- /*797- * can't ll_puts on chrp without openfirmware yet.798- * vidmem just needs to be setup for it.799- * -- Cort800- */801- if ( _machine != _MACH_prep )802- return;803- x = orig_x;804- y = orig_y;805-806- while ( ( c = *s++ ) != '\0' ) {807- if ( c == '\n' ) {808- x = 0;809- if ( ++y >= lines ) {810- /*scroll();*/811- /*y--;*/812- y = 0;813- }814- } else {815- vidmem [ ( x + cols * y ) * 2 ] = c;816- if ( ++x >= cols ) {817- x = 0;818- if ( ++y >= lines ) {819- /*scroll();*/820- /*y--;*/821- y = 0;822- }823- }824- }825- }826-827- orig_x = x;828- orig_y = y;829-}830-#endif831-832-unsigned long get_wchan(struct task_struct *p)833-{834- unsigned long ip, sp;835- unsigned long stack_page = (unsigned long) task_stack_page(p);836- int count = 0;837- if (!p || p == current || p->state == TASK_RUNNING)838- return 0;839- sp = p->thread.ksp;840- do {841- sp = *(unsigned long *)sp;842- if (sp < stack_page || sp >= stack_page + 8188)843- return 0;844- if (count > 0) {845- ip = *(unsigned long *)(sp + 4);846- if (!in_sched_functions(ip))847- return ip;848- }849- } while (count++ < 16);850- return 0;851-}
···293 u16 viocmd;294 HvLpEvent_Rc hvrc;295 struct vioblocklpevent *bevent;0296 struct scatterlist sg[VIOMAXBLOCKDMA];297 int sgindex;298 int statindex;···348 * token so we can match the response up later349 */350 memset(bevent, 0, sizeof(struct vioblocklpevent));351- bevent->event.xFlags.xValid = 1;352- bevent->event.xFlags.xFunction = HvLpEvent_Function_Int;353- bevent->event.xFlags.xAckInd = HvLpEvent_AckInd_DoAck;354- bevent->event.xFlags.xAckType = HvLpEvent_AckType_ImmediateAck;355- bevent->event.xType = HvLpEvent_Type_VirtualIo;356- bevent->event.xSubtype = viocmd;357- bevent->event.xSourceLp = HvLpConfig_getLpIndex();358- bevent->event.xTargetLp = viopath_hostLp;359- bevent->event.xSizeMinus1 =360 offsetof(struct vioblocklpevent, u.rw_data.dma_info) +361 (sizeof(bevent->u.rw_data.dma_info[0]) * nsg) - 1;362- bevent->event.xSourceInstanceId =363- viopath_sourceinst(viopath_hostLp);364- bevent->event.xTargetInstanceId =365- viopath_targetinst(viopath_hostLp);366- bevent->event.xCorrelationToken = (u64)req;367 bevent->version = VIOVERSION;368 bevent->disk = DEVICE_NO(d);369 bevent->u.rw_data.offset = start;···647 /* Notification that a partition went away! */648 return;649 /* First, we should NEVER get an int here...only acks */650- if (event->xFlags.xFunction == HvLpEvent_Function_Int) {651 printk(VIOD_KERN_WARNING652 "Yikes! got an int in viodasd event handler!\n");653- if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) {654 event->xRc = HvLpEvent_Rc_InvalidSubtype;655 HvCallEvent_ackLpEvent(event);656 }···693694 default:695 printk(VIOD_KERN_WARNING "invalid subtype!");696- if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) {697 event->xRc = HvLpEvent_Rc_InvalidSubtype;698 HvCallEvent_ackLpEvent(event);699 }
···293 u16 viocmd;294 HvLpEvent_Rc hvrc;295 struct vioblocklpevent *bevent;296+ struct HvLpEvent *hev;297 struct scatterlist sg[VIOMAXBLOCKDMA];298 int sgindex;299 int statindex;···347 * token so we can match the response up later348 */349 memset(bevent, 0, sizeof(struct vioblocklpevent));350+ hev = &bevent->event;351+ hev->flags = HV_LP_EVENT_VALID | HV_LP_EVENT_DO_ACK |352+ HV_LP_EVENT_INT;353+ hev->xType = HvLpEvent_Type_VirtualIo;354+ hev->xSubtype = viocmd;355+ hev->xSourceLp = HvLpConfig_getLpIndex();356+ hev->xTargetLp = viopath_hostLp;357+ hev->xSizeMinus1 =0358 offsetof(struct vioblocklpevent, u.rw_data.dma_info) +359 (sizeof(bevent->u.rw_data.dma_info[0]) * nsg) - 1;360+ hev->xSourceInstanceId = viopath_sourceinst(viopath_hostLp);361+ hev->xTargetInstanceId = viopath_targetinst(viopath_hostLp);362+ hev->xCorrelationToken = (u64)req;00363 bevent->version = VIOVERSION;364 bevent->disk = DEVICE_NO(d);365 bevent->u.rw_data.offset = start;···649 /* Notification that a partition went away! */650 return;651 /* First, we should NEVER get an int here...only acks */652+ if (hvlpevent_is_int(event)) {653 printk(VIOD_KERN_WARNING654 "Yikes! got an int in viodasd event handler!\n");655+ if (hvlpevent_need_ack(event)) {656 event->xRc = HvLpEvent_Rc_InvalidSubtype;657 HvCallEvent_ackLpEvent(event);658 }···695696 default:697 printk(VIOD_KERN_WARNING "invalid subtype!");698+ if (hvlpevent_need_ack(event)) {699 event->xRc = HvLpEvent_Rc_InvalidSubtype;700 HvCallEvent_ackLpEvent(event);701 }
+3-3
drivers/cdrom/viocd.c
···542 /* Notification that a partition went away! */543 return;544 /* First, we should NEVER get an int here...only acks */545- if (event->xFlags.xFunction == HvLpEvent_Function_Int) {546 printk(VIOCD_KERN_WARNING547 "Yikes! got an int in viocd event handler!\n");548- if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) {549 event->xRc = HvLpEvent_Rc_InvalidSubtype;550 HvCallEvent_ackLpEvent(event);551 }···616 printk(VIOCD_KERN_WARNING617 "message with invalid subtype %0x04X!\n",618 event->xSubtype & VIOMINOR_SUBTYPE_MASK);619- if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) {620 event->xRc = HvLpEvent_Rc_InvalidSubtype;621 HvCallEvent_ackLpEvent(event);622 }
···542 /* Notification that a partition went away! */543 return;544 /* First, we should NEVER get an int here...only acks */545+ if (hvlpevent_is_int(event)) {546 printk(VIOCD_KERN_WARNING547 "Yikes! got an int in viocd event handler!\n");548+ if (hvlpevent_need_ack(event)) {549 event->xRc = HvLpEvent_Rc_InvalidSubtype;550 HvCallEvent_ackLpEvent(event);551 }···616 printk(VIOCD_KERN_WARNING617 "message with invalid subtype %0x04X!\n",618 event->xSubtype & VIOMINOR_SUBTYPE_MASK);619+ if (hvlpevent_need_ack(event)) {620 event->xRc = HvLpEvent_Rc_InvalidSubtype;621 HvCallEvent_ackLpEvent(event);622 }
···6465#endif /* CONFIG_PPC_MULTIPLATFORM */6667-#ifdef CONFIG_PPC_PSERIES68-69-/* Creates table for an individual device node */70-extern void iommu_devnode_init_pSeries(struct device_node *dn);71-72-#endif /* CONFIG_PPC_PSERIES */73-74-#ifdef CONFIG_PPC_ISERIES75-76-/* Creates table for an individual device node */77-extern void iommu_devnode_init_iSeries(struct device_node *dn);78-/* Get table parameters from HV */79-extern void iommu_table_getparms_iSeries(unsigned long busno,80- unsigned char slotno,81- unsigned char virtbus,82- struct iommu_table* tbl);83-84-#endif /* CONFIG_PPC_ISERIES */85-86/* Initializes an iommu_table based in values set in the passed-in87 * structure88 */
···6465#endif /* CONFIG_PPC_MULTIPLATFORM */66000000000000000000067/* Initializes an iommu_table based in values set in the passed-in68 * structure69 */
+1-3
include/asm-powerpc/iseries/hv_call.h
···1/*2- * HvCall.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify···14 * You should have received a copy of the GNU General Public License15 * along with this program; if not, write to the Free Software16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA17- */18-/*19 * This file contains the "hypervisor call" interface which is used to20 * drive the hypervisor from the OS.21 */
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify···15 * You should have received a copy of the GNU General Public License16 * along with this program; if not, write to the Free Software17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA18+ *019 * This file contains the "hypervisor call" interface which is used to20 * drive the hypervisor from the OS.21 */
+36-98
include/asm-powerpc/iseries/hv_call_event.h
···1/*2- * HvCallEvent.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify···14 * You should have received a copy of the GNU General Public License15 * along with this program; if not, write to the Free Software16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA17- */18-/*19 * This file contains the "hypervisor call" interface which is used to20 * drive the hypervisor from the OS.21 */···31typedef u8 HvLpEvent_AckInd;32typedef u8 HvLpEvent_AckType;3334-struct HvCallEvent_PackedParms {35- u8 xAckType:1;36- u8 xAckInd:1;37- u8 xRsvd:1;38- u8 xTargetLp:5;39- u8 xType;40- u16 xSubtype;41- HvLpInstanceId xSourceInstId;42- HvLpInstanceId xTargetInstId;43-};44-45typedef u8 HvLpDma_Direction;46typedef u8 HvLpDma_AddressType;47-48-struct HvCallEvent_PackedDmaParms {49- u8 xDirection:1;50- u8 xLocalAddrType:1;51- u8 xRemoteAddrType:1;52- u8 xRsvd1:5;53- HvLpIndex xRemoteLp;54- u8 xType;55- u8 xRsvd2;56- HvLpInstanceId xLocalInstId;57- HvLpInstanceId xRemoteInstId;58-};5960typedef u64 HvLpEvent_Rc;61typedef u64 HvLpDma_Rc;···67static inline void HvCallEvent_setLpEventStack(u8 queueIndex,68 char *eventStackAddr, u32 eventStackSize)69{70- u64 abs_addr;71-72- abs_addr = virt_to_abs(eventStackAddr);73- HvCall3(HvCallEventSetLpEventStack, queueIndex, abs_addr,74- eventStackSize);75}7677static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,···8081static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event)82{83- u64 abs_addr;84-85-#ifdef DEBUG_SENDEVENT86- printk("HvCallEvent_signalLpEvent: *event = %016lx\n ",87- (unsigned long)event);88-#endif89- abs_addr = virt_to_abs(event);90- return HvCall1(HvCallEventSignalLpEvent, abs_addr);91}9293static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,···92{93 /* Pack the misc bits into a single Dword to pass to PLIC */94 union {95- struct HvCallEvent_PackedParms parms;00000096 u64 dword;97 } packed;98- packed.parms.xAckType = ackType;99- packed.parms.xAckInd = ackInd;100- packed.parms.xRsvd = 0;101- packed.parms.xTargetLp = targetLp;102- packed.parms.xType = type;103- packed.parms.xSubtype = subtype;104- packed.parms.xSourceInstId = sourceInstanceId;105- packed.parms.xTargetInstId = targetInstanceId;106107 return HvCall7(HvCallEventSignalLpEventParms, packed.dword,108 correlationToken, eventData1, eventData2,···115116static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)117{118- u64 abs_addr;119-120- abs_addr = virt_to_abs(event);121- return HvCall1(HvCallEventAckLpEvent, abs_addr);122}123124static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event)125{126- u64 abs_addr;127-128- abs_addr = virt_to_abs(event);129- return HvCall1(HvCallEventCancelLpEvent, abs_addr);130}131132static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId(···158{159 /* Pack the misc bits into a single Dword to pass to PLIC */160 union {161- struct HvCallEvent_PackedDmaParms parms;0000000162 u64 dword;163 } packed;164165- packed.parms.xDirection = direction;166- packed.parms.xLocalAddrType = localAddressType;167- packed.parms.xRemoteAddrType = remoteAddressType;168- packed.parms.xRsvd1 = 0;169- packed.parms.xRemoteLp = remoteLp;170- packed.parms.xType = type;171- packed.parms.xRsvd2 = 0;172- packed.parms.xLocalInstId = localInstanceId;173- packed.parms.xRemoteInstId = remoteInstanceId;174175 return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList,176 remoteBufList, transferLength);177}178179-static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,180- HvLpIndex remoteLp, HvLpDma_Direction direction,181- HvLpInstanceId localInstanceId,182- HvLpInstanceId remoteInstanceId,183- HvLpDma_AddressType localAddressType,184- HvLpDma_AddressType remoteAddressType,185- u64 localAddrOrTce, u64 remoteAddrOrTce, u32 transferLength)186-{187- /* Pack the misc bits into a single Dword to pass to PLIC */188- union {189- struct HvCallEvent_PackedDmaParms parms;190- u64 dword;191- } packed;192-193- packed.parms.xDirection = direction;194- packed.parms.xLocalAddrType = localAddressType;195- packed.parms.xRemoteAddrType = remoteAddressType;196- packed.parms.xRsvd1 = 0;197- packed.parms.xRemoteLp = remoteLp;198- packed.parms.xType = type;199- packed.parms.xRsvd2 = 0;200- packed.parms.xLocalInstId = localInstanceId;201- packed.parms.xRemoteInstId = remoteInstanceId;202-203- return (HvLpDma_Rc)HvCall4(HvCallEventDmaSingle, packed.dword,204- localAddrOrTce, remoteAddrOrTce, transferLength);205-}206-207static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,208 u32 length, HvLpDma_Direction dir)209{210- u64 abs_addr;211-212- abs_addr = virt_to_abs(local);213- return HvCall4(HvCallEventDmaToSp, abs_addr, remote, length, dir);214}215216#endif /* _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H */
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify···15 * You should have received a copy of the GNU General Public License16 * along with this program; if not, write to the Free Software17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA18+ *019 * This file contains the "hypervisor call" interface which is used to20 * drive the hypervisor from the OS.21 */···33typedef u8 HvLpEvent_AckInd;34typedef u8 HvLpEvent_AckType;350000000000036typedef u8 HvLpDma_Direction;37typedef u8 HvLpDma_AddressType;0000000000003839typedef u64 HvLpEvent_Rc;40typedef u64 HvLpDma_Rc;···92static inline void HvCallEvent_setLpEventStack(u8 queueIndex,93 char *eventStackAddr, u32 eventStackSize)94{95+ HvCall3(HvCallEventSetLpEventStack, queueIndex,96+ virt_to_abs(eventStackAddr), eventStackSize);00097}9899static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,···108109static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event)110{111+ return HvCall1(HvCallEventSignalLpEvent, virt_to_abs(event));0000000112}113114static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,···127{128 /* Pack the misc bits into a single Dword to pass to PLIC */129 union {130+ struct {131+ u8 ack_and_target;132+ u8 type;133+ u16 subtype;134+ HvLpInstanceId src_inst;135+ HvLpInstanceId target_inst;136+ } parms;137 u64 dword;138 } packed;139+140+ packed.parms.ack_and_target = (ackType << 7) | (ackInd << 6) | targetLp;141+ packed.parms.type = type;142+ packed.parms.subtype = subtype;143+ packed.parms.src_inst = sourceInstanceId;144+ packed.parms.target_inst = targetInstanceId;00145146 return HvCall7(HvCallEventSignalLpEventParms, packed.dword,147 correlationToken, eventData1, eventData2,···146147static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)148{149+ return HvCall1(HvCallEventAckLpEvent, virt_to_abs(event));000150}151152static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event)153{154+ return HvCall1(HvCallEventCancelLpEvent, virt_to_abs(event));000155}156157static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId(···195{196 /* Pack the misc bits into a single Dword to pass to PLIC */197 union {198+ struct {199+ u8 flags;200+ HvLpIndex remote;201+ u8 type;202+ u8 reserved;203+ HvLpInstanceId local_inst;204+ HvLpInstanceId remote_inst;205+ } parms;206 u64 dword;207 } packed;208209+ packed.parms.flags = (direction << 7) |210+ (localAddressType << 6) | (remoteAddressType << 5);211+ packed.parms.remote = remoteLp;212+ packed.parms.type = type;213+ packed.parms.reserved = 0;214+ packed.parms.local_inst = localInstanceId;215+ packed.parms.remote_inst = remoteInstanceId;00216217 return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList,218 remoteBufList, transferLength);219}2200000000000000000000000000000221static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,222 u32 length, HvLpDma_Direction dir)223{224+ return HvCall4(HvCallEventDmaToSp, virt_to_abs(local), remote,225+ length, dir);00226}227228#endif /* _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H */
-1
include/asm-powerpc/iseries/hv_call_sc.h
···1/*2- * HvCallSc.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
-1
include/asm-powerpc/iseries/hv_lp_config.h
···1/*2- * HvLpConfig.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
+31-11
include/asm-powerpc/iseries/hv_lp_event.h
···1/*2- * HvLpEvent.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify···31 * partitions through PLIC.32 */3334-struct HvEventFlags {35- u8 xValid:1; /* Indicates a valid request x00-x00 */36- u8 xRsvd1:4; /* Reserved ... */37- u8 xAckType:1; /* Immediate or deferred ... */38- u8 xAckInd:1; /* Indicates if ACK required ... */39- u8 xFunction:1; /* Interrupt or Acknowledge ... */40-};41-42-43struct HvLpEvent {44- struct HvEventFlags xFlags; /* Event flags x00-x00 */45 u8 xType; /* Type of message x01-x01 */46 u16 xSubtype; /* Subtype for event x02-x03 */47 u8 xSourceLp; /* Source LP x04-x04 */···116#define HvLpEvent_AckType_ImmediateAck 0117#define HvLpEvent_AckType_DeferredAck 111800000119#define HvLpDma_Direction_LocalToRemote 0120#define HvLpDma_Direction_RemoteToLocal 1121···133#define HvLpDma_Rc_PathClosed 3134#define HvLpDma_Rc_InvalidAddress 4135#define HvLpDma_Rc_InvalidLength 50000000000000000000000000136137#endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify···32 * partitions through PLIC.33 */3400000000035struct HvLpEvent {36+ u8 flags; /* Event flags x00-x00 */37 u8 xType; /* Type of message x01-x01 */38 u16 xSubtype; /* Subtype for event x02-x03 */39 u8 xSourceLp; /* Source LP x04-x04 */···126#define HvLpEvent_AckType_ImmediateAck 0127#define HvLpEvent_AckType_DeferredAck 1128129+#define HV_LP_EVENT_INT 0x01130+#define HV_LP_EVENT_DO_ACK 0x02131+#define HV_LP_EVENT_DEFERRED_ACK 0x04132+#define HV_LP_EVENT_VALID 0x80133+134#define HvLpDma_Direction_LocalToRemote 0135#define HvLpDma_Direction_RemoteToLocal 1136···138#define HvLpDma_Rc_PathClosed 3139#define HvLpDma_Rc_InvalidAddress 4140#define HvLpDma_Rc_InvalidLength 5141+142+static inline int hvlpevent_is_valid(struct HvLpEvent *h)143+{144+ return h->flags & HV_LP_EVENT_VALID;145+}146+147+static inline void hvlpevent_invalidate(struct HvLpEvent *h)148+{149+ h->flags &= ~ HV_LP_EVENT_VALID;150+}151+152+static inline int hvlpevent_is_int(struct HvLpEvent *h)153+{154+ return h->flags & HV_LP_EVENT_INT;155+}156+157+static inline int hvlpevent_is_ack(struct HvLpEvent *h)158+{159+ return !hvlpevent_is_int(h);160+}161+162+static inline int hvlpevent_need_ack(struct HvLpEvent *h)163+{164+ return h->flags & HV_LP_EVENT_DO_ACK;165+}166167#endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */
-1
include/asm-powerpc/iseries/hv_types.h
···1/*2- * HvTypes.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
+13-1
include/asm-powerpc/iseries/iseries_io.h
···6#ifdef CONFIG_PPC_ISERIES7#include <linux/types.h>8/*9- * File iSeries_io.h created by Allan Trautman on Thu Dec 28 2000.10 *11 * Remaps the io.h for the iSeries Io12 * Copyright (C) 2000 Allan H Trautman, IBM Corporation···32 * End Change Activity33 */34035extern u8 iSeries_Read_Byte(const volatile void __iomem * IoAddress);36extern u16 iSeries_Read_Word(const volatile void __iomem * IoAddress);37extern u32 iSeries_Read_Long(const volatile void __iomem * IoAddress);···45 size_t n);46extern void iSeries_memcpy_fromio(void *dest,47 const volatile void __iomem *source, size_t n);000000000004849#endif /* CONFIG_PPC_ISERIES */50#endif /* _ASM_POWERPC_ISERIES_ISERIES_IO_H */
···6#ifdef CONFIG_PPC_ISERIES7#include <linux/types.h>8/*9+ * Created by Allan Trautman on Thu Dec 28 2000.10 *11 * Remaps the io.h for the iSeries Io12 * Copyright (C) 2000 Allan H Trautman, IBM Corporation···32 * End Change Activity33 */3435+#ifdef CONFIG_PCI36extern u8 iSeries_Read_Byte(const volatile void __iomem * IoAddress);37extern u16 iSeries_Read_Word(const volatile void __iomem * IoAddress);38extern u32 iSeries_Read_Long(const volatile void __iomem * IoAddress);···44 size_t n);45extern void iSeries_memcpy_fromio(void *dest,46 const volatile void __iomem *source, size_t n);47+#else48+static inline u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)49+{50+ return 0xff;51+}52+53+static inline void iSeries_Write_Byte(u8 IoData,54+ volatile void __iomem *IoAddress)55+{56+}57+#endif /* CONFIG_PCI */5859#endif /* CONFIG_PPC_ISERIES */60#endif /* _ASM_POWERPC_ISERIES_ISERIES_IO_H */
-1
include/asm-powerpc/iseries/it_exp_vpd_panel.h
···1/*2- * ItExtVpdPanel.h3 * Copyright (C) 2002 Dave Boutcher IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2002 Dave Boutcher IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
+11-11
include/asm-powerpc/iseries/it_lp_naca.h
···1/*2- * ItLpNaca.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify···36 u8 xLpIndex; // LP Index x0B-x0B37 u16 xMaxLpQueues; // Number of allocated queues x0C-x0D38 u16 xLpQueueOffset; // Offset to start of LP queues x0E-x0F39- u8 xPirEnvironMode:8; // Piranha or hardware x10-x1040- u8 xPirConsoleMode:8; // Piranha console indicator x11-x1141- u8 xPirDasdMode:8; // Piranha dasd indicator x12-x1242 u8 xRsvd1_0[5]; // Reserved for Piranha related x13-x1743- u8 xLparInstalled:1; // Is LPAR installed on system x18-x1F44- u8 xSysPartitioned:1; // Is the system partitioned ...45- u8 xHwSyncedTBs:1; // Hardware synced TBs ...46- u8 xIntProcUtilHmt:1; // Utilize HMT for interrupts ...47- u8 xRsvd1_1:4; // Reserved ...48- u8 xSpVpdFormat:8; // VPD areas are in CSP format ...49- u8 xIntProcRatio:8; // Ratio of int procs to procs ...50 u8 xRsvd1_2[5]; // Reserved ...51 u16 xRsvd1_3; // Reserved x20-x2152 u16 xPlicVrmIndex; // VRM index of PLIC x22-x23···71};7273extern struct ItLpNaca itLpNaca;000007475#endif /* _ASM_POWERPC_ISERIES_IT_LP_NACA_H */
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify···37 u8 xLpIndex; // LP Index x0B-x0B38 u16 xMaxLpQueues; // Number of allocated queues x0C-x0D39 u16 xLpQueueOffset; // Offset to start of LP queues x0E-x0F40+ u8 xPirEnvironMode; // Piranha or hardware x10-x1041+ u8 xPirConsoleMode; // Piranha console indicator x11-x1142+ u8 xPirDasdMode; // Piranha dasd indicator x12-x1243 u8 xRsvd1_0[5]; // Reserved for Piranha related x13-x1744+ u8 flags; // flags, see below x18-x1F45+ u8 xSpVpdFormat; // VPD areas are in CSP format ...46+ u8 xIntProcRatio; // Ratio of int procs to procs ...000047 u8 xRsvd1_2[5]; // Reserved ...48 u16 xRsvd1_3; // Reserved x20-x2149 u16 xPlicVrmIndex; // VRM index of PLIC x22-x23···76};7778extern struct ItLpNaca itLpNaca;79+80+#define ITLPNACA_LPAR 0x80 /* Is LPAR installed on the system */81+#define ITLPNACA_PARTITIONED 0x40 /* Is the system partitioned */82+#define ITLPNACA_HWSYNCEDTBS 0x20 /* Hardware synced TBs */83+#define ITLPNACA_HMTINT 0x10 /* Utilize MHT for interrupts */8485#endif /* _ASM_POWERPC_ISERIES_IT_LP_NACA_H */
-1
include/asm-powerpc/iseries/it_lp_queue.h
···1/*2- * ItLpQueue.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
+1-2
include/asm-powerpc/iseries/it_lp_reg_save.h
···1/*2- * ItLpRegSave.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify···8283extern struct ItLpRegSave iseries_reg_save[];8485-#endif /* _ITLPREGSAVE_H */
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify···8384extern struct ItLpRegSave iseries_reg_save[];8586+#endif /* _ASM_POWERPC_ISERIES_IT_LP_REG_SAVE_H */
-1
include/asm-powerpc/iseries/lpar_map.h
···1/*2- * LparMap.h3 * Copyright (C) 2001 Mike Corrigan IBM Corporation4 *5 * This program is free software; you can redistribute it and/or modify
···1/*02 * Copyright (C) 2001 Mike Corrigan IBM Corporation3 *4 * This program is free software; you can redistribute it and/or modify
-1
include/asm-powerpc/iseries/mf.h
···1/*2- * mf.h3 * Copyright (C) 2001 Troy D. Armstrong IBM Corporation4 * Copyright (C) 2004 Stephen Rothwell IBM Corporation5 *
···1/*02 * Copyright (C) 2001 Troy D. Armstrong IBM Corporation3 * Copyright (C) 2004 Stephen Rothwell IBM Corporation4 *