aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/misc_64.S70
-rw-r--r--arch/powerpc/kernel/process.c4
-rw-r--r--arch/powerpc/kernel/prom.c21
-rw-r--r--arch/powerpc/kernel/prom_init.c11
-rw-r--r--arch/powerpc/kernel/rtas.c5
-rw-r--r--arch/powerpc/kernel/setup-common.c40
-rw-r--r--arch/powerpc/kernel/setup_32.c1
-rw-r--r--arch/powerpc/kernel/setup_64.c46
-rw-r--r--arch/powerpc/kernel/signal_32.c1
-rw-r--r--arch/powerpc/kernel/signal_64.c1
-rw-r--r--arch/powerpc/kernel/smp.c1
-rw-r--r--arch/powerpc/kernel/time.c5
-rw-r--r--arch/powerpc/kernel/traps.c11
13 files changed, 140 insertions, 77 deletions
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
index b3e95ff0dba0..ae1433da09b2 100644
--- a/arch/powerpc/kernel/misc_64.S
+++ b/arch/powerpc/kernel/misc_64.S
@@ -604,6 +604,76 @@ _GLOBAL(real_writeb)
604#endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */ 604#endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
605 605
606/* 606/*
607 * SCOM access functions for 970 (FX only for now)
608 *
609 * unsigned long scom970_read(unsigned int address);
610 * void scom970_write(unsigned int address, unsigned long value);
611 *
612 * The address passed in is the 24 bits register address. This code
613 * is 970 specific and will not check the status bits, so you should
614 * know what you are doing.
615 */
616_GLOBAL(scom970_read)
617 /* interrupts off */
618 mfmsr r4
619 ori r0,r4,MSR_EE
620 xori r0,r0,MSR_EE
621 mtmsrd r0,1
622
623 /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
624 * (including parity). On current CPUs they must be 0'd,
625 * and finally or in RW bit
626 */
627 rlwinm r3,r3,8,0,15
628 ori r3,r3,0x8000
629
630 /* do the actual scom read */
631 sync
632 mtspr SPRN_SCOMC,r3
633 isync
634 mfspr r3,SPRN_SCOMD
635 isync
636 mfspr r0,SPRN_SCOMC
637 isync
638
639 /* XXX: fixup result on some buggy 970's (ouch ! we lost a bit, bah
640 * that's the best we can do). Not implemented yet as we don't use
641 * the scom on any of the bogus CPUs yet, but may have to be done
642 * ultimately
643 */
644
645 /* restore interrupts */
646 mtmsrd r4,1
647 blr
648
649
650_GLOBAL(scom970_write)
651 /* interrupts off */
652 mfmsr r5
653 ori r0,r5,MSR_EE
654 xori r0,r0,MSR_EE
655 mtmsrd r0,1
656
657 /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
658 * (including parity). On current CPUs they must be 0'd.
659 */
660
661 rlwinm r3,r3,8,0,15
662
663 sync
664 mtspr SPRN_SCOMD,r4 /* write data */
665 isync
666 mtspr SPRN_SCOMC,r3 /* write command */
667 isync
668 mfspr 3,SPRN_SCOMC
669 isync
670
671 /* restore interrupts */
672 mtmsrd r5,1
673 blr
674
675
676/*
607 * Create a kernel thread 677 * Create a kernel thread
608 * kernel_thread(fn, arg, flags) 678 * kernel_thread(fn, arg, flags)
609 */ 679 */
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 7f64f0464d44..de69fb37c731 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -46,10 +46,10 @@
46#include <asm/processor.h> 46#include <asm/processor.h>
47#include <asm/mmu.h> 47#include <asm/mmu.h>
48#include <asm/prom.h> 48#include <asm/prom.h>
49#include <asm/machdep.h>
49#ifdef CONFIG_PPC64 50#ifdef CONFIG_PPC64
50#include <asm/firmware.h> 51#include <asm/firmware.h>
51#include <asm/time.h> 52#include <asm/time.h>
52#include <asm/machdep.h>
53#endif 53#endif
54 54
55extern unsigned long _get_SP(void); 55extern unsigned long _get_SP(void);
@@ -203,10 +203,8 @@ int dump_spe(struct pt_regs *regs, elf_vrregset_t *evrregs)
203 203
204int set_dabr(unsigned long dabr) 204int set_dabr(unsigned long dabr)
205{ 205{
206#ifdef CONFIG_PPC64
207 if (ppc_md.set_dabr) 206 if (ppc_md.set_dabr)
208 return ppc_md.set_dabr(dabr); 207 return ppc_md.set_dabr(dabr);
209#endif
210 208
211 mtspr(SPRN_DABR, dabr); 209 mtspr(SPRN_DABR, dabr);
212 return 0; 210 return 0;
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 3675ef4bac90..f645adb57534 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -1974,14 +1974,29 @@ EXPORT_SYMBOL(get_property);
1974/* 1974/*
1975 * Add a property to a node 1975 * Add a property to a node
1976 */ 1976 */
1977void prom_add_property(struct device_node* np, struct property* prop) 1977int prom_add_property(struct device_node* np, struct property* prop)
1978{ 1978{
1979 struct property **next = &np->properties; 1979 struct property **next;
1980 1980
1981 prop->next = NULL; 1981 prop->next = NULL;
1982 while (*next) 1982 write_lock(&devtree_lock);
1983 next = &np->properties;
1984 while (*next) {
1985 if (strcmp(prop->name, (*next)->name) == 0) {
1986 /* duplicate ! don't insert it */
1987 write_unlock(&devtree_lock);
1988 return -1;
1989 }
1983 next = &(*next)->next; 1990 next = &(*next)->next;
1991 }
1984 *next = prop; 1992 *next = prop;
1993 write_unlock(&devtree_lock);
1994
1995 /* try to add to proc as well if it was initialized */
1996 if (np->pde)
1997 proc_device_tree_add_prop(np->pde, prop);
1998
1999 return 0;
1985} 2000}
1986 2001
1987/* I quickly hacked that one, check against spec ! */ 2002/* I quickly hacked that one, check against spec ! */
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index c758b6624d7b..6dc33d19fc2a 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -403,19 +403,19 @@ static int __init prom_next_node(phandle *nodep)
403 } 403 }
404} 404}
405 405
406static int __init prom_getprop(phandle node, const char *pname, 406static int inline prom_getprop(phandle node, const char *pname,
407 void *value, size_t valuelen) 407 void *value, size_t valuelen)
408{ 408{
409 return call_prom("getprop", 4, 1, node, ADDR(pname), 409 return call_prom("getprop", 4, 1, node, ADDR(pname),
410 (u32)(unsigned long) value, (u32) valuelen); 410 (u32)(unsigned long) value, (u32) valuelen);
411} 411}
412 412
413static int __init prom_getproplen(phandle node, const char *pname) 413static int inline prom_getproplen(phandle node, const char *pname)
414{ 414{
415 return call_prom("getproplen", 2, 1, node, ADDR(pname)); 415 return call_prom("getproplen", 2, 1, node, ADDR(pname));
416} 416}
417 417
418static int __init prom_setprop(phandle node, const char *pname, 418static int inline prom_setprop(phandle node, const char *pname,
419 void *value, size_t valuelen) 419 void *value, size_t valuelen)
420{ 420{
421 return call_prom("setprop", 4, 1, node, ADDR(pname), 421 return call_prom("setprop", 4, 1, node, ADDR(pname),
@@ -1408,8 +1408,9 @@ static int __init prom_find_machine_type(void)
1408 struct prom_t *_prom = &RELOC(prom); 1408 struct prom_t *_prom = &RELOC(prom);
1409 char compat[256]; 1409 char compat[256];
1410 int len, i = 0; 1410 int len, i = 0;
1411#ifdef CONFIG_PPC64
1411 phandle rtas; 1412 phandle rtas;
1412 1413#endif
1413 len = prom_getprop(_prom->root, "compatible", 1414 len = prom_getprop(_prom->root, "compatible",
1414 compat, sizeof(compat)-1); 1415 compat, sizeof(compat)-1);
1415 if (len > 0) { 1416 if (len > 0) {
@@ -1872,7 +1873,7 @@ static void __init fixup_device_tree(void)
1872 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev)) 1873 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev))
1873 == PROM_ERROR) 1874 == PROM_ERROR)
1874 return; 1875 return;
1875 if (u3_rev != 0x35 && u3_rev != 0x37) 1876 if (u3_rev < 0x35 || u3_rev > 0x39)
1876 return; 1877 return;
1877 /* does it need fixup ? */ 1878 /* does it need fixup ? */
1878 if (prom_getproplen(i2c, "interrupts") > 0) 1879 if (prom_getproplen(i2c, "interrupts") > 0)
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index b7fc2d884950..9d4e07f6f1ec 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -17,6 +17,7 @@
17#include <linux/spinlock.h> 17#include <linux/spinlock.h>
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/delay.h>
20 21
21#include <asm/prom.h> 22#include <asm/prom.h>
22#include <asm/rtas.h> 23#include <asm/rtas.h>
@@ -83,7 +84,7 @@ void call_rtas_display_status_delay(unsigned char c)
83 while (width-- > 0) 84 while (width-- > 0)
84 call_rtas_display_status(' '); 85 call_rtas_display_status(' ');
85 width = 16; 86 width = 16;
86 udelay(500000); 87 mdelay(500);
87 pending_newline = 1; 88 pending_newline = 1;
88 } else { 89 } else {
89 if (pending_newline) { 90 if (pending_newline) {
@@ -608,7 +609,6 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
608 return 0; 609 return 0;
609} 610}
610 611
611#ifdef CONFIG_SMP
612/* This version can't take the spinlock, because it never returns */ 612/* This version can't take the spinlock, because it never returns */
613 613
614struct rtas_args rtas_stop_self_args = { 614struct rtas_args rtas_stop_self_args = {
@@ -633,7 +633,6 @@ void rtas_stop_self(void)
633 633
634 panic("Alas, I survived.\n"); 634 panic("Alas, I survived.\n");
635} 635}
636#endif
637 636
638/* 637/*
639 * Call early during boot, before mem init or bootmem, to retreive the RTAS 638 * Call early during boot, before mem init or bootmem, to retreive the RTAS
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index d43fa8c0e5ac..e22856ecb5a0 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -405,6 +405,46 @@ static int __init set_preferred_console(void)
405console_initcall(set_preferred_console); 405console_initcall(set_preferred_console);
406#endif /* CONFIG_PPC_MULTIPLATFORM */ 406#endif /* CONFIG_PPC_MULTIPLATFORM */
407 407
408void __init check_for_initrd(void)
409{
410#ifdef CONFIG_BLK_DEV_INITRD
411 unsigned long *prop;
412
413 DBG(" -> check_for_initrd()\n");
414
415 if (of_chosen) {
416 prop = (unsigned long *)get_property(of_chosen,
417 "linux,initrd-start", NULL);
418 if (prop != NULL) {
419 initrd_start = (unsigned long)__va(*prop);
420 prop = (unsigned long *)get_property(of_chosen,
421 "linux,initrd-end", NULL);
422 if (prop != NULL) {
423 initrd_end = (unsigned long)__va(*prop);
424 initrd_below_start_ok = 1;
425 } else
426 initrd_start = 0;
427 }
428 }
429
430 /* If we were passed an initrd, set the ROOT_DEV properly if the values
431 * look sensible. If not, clear initrd reference.
432 */
433 if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
434 initrd_end > initrd_start)
435 ROOT_DEV = Root_RAM0;
436 else {
437 printk("Bogus initrd %08lx %08lx\n", initrd_start, initrd_end);
438 initrd_start = initrd_end = 0;
439 }
440
441 if (initrd_start)
442 printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
443
444 DBG(" <- check_for_initrd()\n");
445#endif /* CONFIG_BLK_DEV_INITRD */
446}
447
408#ifdef CONFIG_SMP 448#ifdef CONFIG_SMP
409 449
410/** 450/**
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index b45eedbb4b3a..3af2631e3fab 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -286,6 +286,7 @@ void __init setup_arch(char **cmdline_p)
286 loops_per_jiffy = 500000000 / HZ; 286 loops_per_jiffy = 500000000 / HZ;
287 287
288 unflatten_device_tree(); 288 unflatten_device_tree();
289 check_for_initrd();
289 finish_device_tree(); 290 finish_device_tree();
290 291
291 smp_setup_cpu_maps(); 292 smp_setup_cpu_maps();
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index b0994050024f..0471e843b6c5 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -41,7 +41,6 @@
41#include <asm/elf.h> 41#include <asm/elf.h>
42#include <asm/machdep.h> 42#include <asm/machdep.h>
43#include <asm/paca.h> 43#include <asm/paca.h>
44#include <asm/ppcdebug.h>
45#include <asm/time.h> 44#include <asm/time.h>
46#include <asm/cputable.h> 45#include <asm/cputable.h>
47#include <asm/sections.h> 46#include <asm/sections.h>
@@ -60,6 +59,7 @@
60#include <asm/firmware.h> 59#include <asm/firmware.h>
61#include <asm/systemcfg.h> 60#include <asm/systemcfg.h>
62#include <asm/xmon.h> 61#include <asm/xmon.h>
62#include <asm/udbg.h>
63 63
64#ifdef DEBUG 64#ifdef DEBUG
65#define DBG(fmt...) udbg_printf(fmt) 65#define DBG(fmt...) udbg_printf(fmt)
@@ -244,12 +244,6 @@ void __init early_setup(unsigned long dt_ptr)
244 DBG(" -> early_setup()\n"); 244 DBG(" -> early_setup()\n");
245 245
246 /* 246 /*
247 * Fill the default DBG level (do we want to keep
248 * that old mecanism around forever ?)
249 */
250 ppcdbg_initialize();
251
252 /*
253 * Do early initializations using the flattened device 247 * Do early initializations using the flattened device
254 * tree, like retreiving the physical memory map or 248 * tree, like retreiving the physical memory map or
255 * calculating/retreiving the hash table size 249 * calculating/retreiving the hash table size
@@ -401,43 +395,6 @@ static void __init initialize_cache_info(void)
401 DBG(" <- initialize_cache_info()\n"); 395 DBG(" <- initialize_cache_info()\n");
402} 396}
403 397
404static void __init check_for_initrd(void)
405{
406#ifdef CONFIG_BLK_DEV_INITRD
407 u64 *prop;
408
409 DBG(" -> check_for_initrd()\n");
410
411 if (of_chosen) {
412 prop = (u64 *)get_property(of_chosen,
413 "linux,initrd-start", NULL);
414 if (prop != NULL) {
415 initrd_start = (unsigned long)__va(*prop);
416 prop = (u64 *)get_property(of_chosen,
417 "linux,initrd-end", NULL);
418 if (prop != NULL) {
419 initrd_end = (unsigned long)__va(*prop);
420 initrd_below_start_ok = 1;
421 } else
422 initrd_start = 0;
423 }
424 }
425
426 /* If we were passed an initrd, set the ROOT_DEV properly if the values
427 * look sensible. If not, clear initrd reference.
428 */
429 if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
430 initrd_end > initrd_start)
431 ROOT_DEV = Root_RAM0;
432 else
433 initrd_start = initrd_end = 0;
434
435 if (initrd_start)
436 printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
437
438 DBG(" <- check_for_initrd()\n");
439#endif /* CONFIG_BLK_DEV_INITRD */
440}
441 398
442/* 399/*
443 * Do some initial setup of the system. The parameters are those which 400 * Do some initial setup of the system. The parameters are those which
@@ -521,7 +478,6 @@ void __init setup_system(void)
521 478
522 printk("-----------------------------------------------------\n"); 479 printk("-----------------------------------------------------\n");
523 printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size); 480 printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
524 printk("ppc64_debug_switch = 0x%lx\n", ppc64_debug_switch);
525 printk("ppc64_interrupt_controller = 0x%ld\n", ppc64_interrupt_controller); 481 printk("ppc64_interrupt_controller = 0x%ld\n", ppc64_interrupt_controller);
526 printk("systemcfg = 0x%p\n", systemcfg); 482 printk("systemcfg = 0x%p\n", systemcfg);
527 printk("systemcfg->platform = 0x%x\n", systemcfg->platform); 483 printk("systemcfg->platform = 0x%x\n", systemcfg->platform);
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 876c57c11365..081d931eae48 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -44,7 +44,6 @@
44#include <asm/cacheflush.h> 44#include <asm/cacheflush.h>
45#ifdef CONFIG_PPC64 45#ifdef CONFIG_PPC64
46#include "ppc32.h" 46#include "ppc32.h"
47#include <asm/ppcdebug.h>
48#include <asm/unistd.h> 47#include <asm/unistd.h>
49#include <asm/vdso.h> 48#include <asm/vdso.h>
50#else 49#else
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
index ec9d0984b6a0..58194e150711 100644
--- a/arch/powerpc/kernel/signal_64.c
+++ b/arch/powerpc/kernel/signal_64.c
@@ -33,7 +33,6 @@
33#include <asm/ucontext.h> 33#include <asm/ucontext.h>
34#include <asm/uaccess.h> 34#include <asm/uaccess.h>
35#include <asm/pgtable.h> 35#include <asm/pgtable.h>
36#include <asm/ppcdebug.h>
37#include <asm/unistd.h> 36#include <asm/unistd.h>
38#include <asm/cacheflush.h> 37#include <asm/cacheflush.h>
39#include <asm/vdso.h> 38#include <asm/vdso.h>
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 1794a694a928..5c330c3366e4 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -40,7 +40,6 @@
40#include <asm/prom.h> 40#include <asm/prom.h>
41#include <asm/smp.h> 41#include <asm/smp.h>
42#include <asm/time.h> 42#include <asm/time.h>
43#include <asm/xmon.h>
44#include <asm/machdep.h> 43#include <asm/machdep.h>
45#include <asm/cputable.h> 44#include <asm/cputable.h>
46#include <asm/system.h> 45#include <asm/system.h>
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index b1c89bc4bf90..a6282b625b44 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -61,6 +61,7 @@
61#include <asm/prom.h> 61#include <asm/prom.h>
62#include <asm/irq.h> 62#include <asm/irq.h>
63#include <asm/div64.h> 63#include <asm/div64.h>
64#include <asm/smp.h>
64#ifdef CONFIG_PPC64 65#ifdef CONFIG_PPC64
65#include <asm/systemcfg.h> 66#include <asm/systemcfg.h>
66#include <asm/firmware.h> 67#include <asm/firmware.h>
@@ -119,10 +120,6 @@ static unsigned adjusting_time = 0;
119unsigned long ppc_proc_freq; 120unsigned long ppc_proc_freq;
120unsigned long ppc_tb_freq; 121unsigned long ppc_tb_freq;
121 122
122#ifdef CONFIG_PPC32 /* XXX for now */
123#define boot_cpuid 0
124#endif
125
126u64 tb_last_jiffy __cacheline_aligned_in_smp; 123u64 tb_last_jiffy __cacheline_aligned_in_smp;
127unsigned long tb_last_stamp; 124unsigned long tb_last_stamp;
128 125
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 07e5ee40b870..32f215825e8d 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -39,7 +39,6 @@
39#include <asm/io.h> 39#include <asm/io.h>
40#include <asm/machdep.h> 40#include <asm/machdep.h>
41#include <asm/rtas.h> 41#include <asm/rtas.h>
42#include <asm/xmon.h>
43#include <asm/pmc.h> 42#include <asm/pmc.h>
44#ifdef CONFIG_PPC32 43#ifdef CONFIG_PPC32
45#include <asm/reg.h> 44#include <asm/reg.h>
@@ -748,22 +747,12 @@ static int check_bug_trap(struct pt_regs *regs)
748 return 0; 747 return 0;
749 if (bug->line & BUG_WARNING_TRAP) { 748 if (bug->line & BUG_WARNING_TRAP) {
750 /* this is a WARN_ON rather than BUG/BUG_ON */ 749 /* this is a WARN_ON rather than BUG/BUG_ON */
751#ifdef CONFIG_XMON
752 xmon_printf(KERN_ERR "Badness in %s at %s:%ld\n",
753 bug->function, bug->file,
754 bug->line & ~BUG_WARNING_TRAP);
755#endif /* CONFIG_XMON */
756 printk(KERN_ERR "Badness in %s at %s:%ld\n", 750 printk(KERN_ERR "Badness in %s at %s:%ld\n",
757 bug->function, bug->file, 751 bug->function, bug->file,
758 bug->line & ~BUG_WARNING_TRAP); 752 bug->line & ~BUG_WARNING_TRAP);
759 dump_stack(); 753 dump_stack();
760 return 1; 754 return 1;
761 } 755 }
762#ifdef CONFIG_XMON
763 xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
764 bug->function, bug->file, bug->line);
765 xmon(regs);
766#endif /* CONFIG_XMON */
767 printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n", 756 printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
768 bug->function, bug->file, bug->line); 757 bug->function, bug->file, bug->line);
769 758