[Suzaku:01942] Re: Kernel エラー

mizo email@hidden
2010年 9月 2日 (木) 20:55:59 JST


$B9B^<$G$9!#(B

Nobuaki Sugishima wrote:
> $B!!(Bmain$B$H%I%i%$%P$H$N$d$j<h$j$G$9$,!"%7%9%F%`%3!<%k$r;H$&J}K!$O%I%i%$%P$N(B
> $B%b%8%e!<%k$r0lHL#I!?#O$H3d$j9~$_$KJ,3d$7$J$1$l$P$J$i$J$$$h$&$J$N$G!"(B
> write$B$K(Bmain$B$+$i%I%i%$%P$X$N(BCommand$B$rDI2C$9$k$H$$$&4JJX$JJ}K!$G%H%i%$$7$F(B
> $B$$$^$9!#!'(B

command$B$rAw$k$N$G$"$l$P!"(Bioctl()$B$NJ}$,E,$7$F$$$k$H;W$$$^$9!#$b$A$m$s(Bwrite()
$B$G$d$C$F$O$$$1$J$$$H$$$&$3$H$O$"$j$^$;$s$,!#(B

> static ssize_t my_write(struct file *filp, const char __user *buf,
>    size_t count, loff_t *offp)
> {
> $B!&!&!&!&!&!&(B
> if (down_interruptible(&sem)) {
>  retval = -ERESTARTSYS;
>  goto err1;
> }
> if (buf == NULL) {
>  retval = -EFAULT;
>  goto err1;
> }
> 
> valbuf = (char *) kmalloc(sizeof(char) * 8 + 1, GFP_KERNEL); // buf size
> $B$O(Bprogram$BB&$G(B8bit$B$K8GDj$NLsB+(B

$B8GDj$G$"$l$P!"(Bkmalloc()$B$7$J$$$G!"4X?tFb$G!"(B
char valbuf[9];
$B$7$F$O$I$&$G$7$g$&!)(B

> strcpy(valbuf, buf);             // $B3NJ]$7$?(Bkernel buffer$B$K;XDjCM$r%3%T!<(B

kmalloc()$B$NLa$jCM%A%'%C%/L5$7$G!"(Bvalbuf$B$r(Bstrcpy()$B$G;H$C$F$$$^$9$,Bg>fIW$G$9$+!)(B

> if (valbuf == NULL) {
>  retval = -EFAULT;
>  goto err1;
> }
> if (copy_from_user(valbuf, buf, count)) {

count$B$,!"(Bvalbuf$B$N%5%$%:$r1[$($k$3$H$OK\Ev$K$"$j$^$;$s$+!)$$$A$*$&%A%'%C%/$rF~$l$F(B
$B$_$k$H$I$&$J$j$^$9$+!)(B

>  retval = -EFAULT;
>  goto err2;
> }
> 
> if (dev->minor == 0) {            // Minor$B$O;HMQ$7$J$$(B
>  inval = simple_strtoul(valbuf, &endp, 16);     // $BJ8;zNs$r?tCM$KJQ49(B

endp$B$NCM$r%A%'%C%/$7$J$$$N$G$"$l$P(BNULL$B$GNI$$$H;W$$$^$9!#$A$J$_$K!"(Bendp$B$N%5%$%:$O(B
$B$$$/$D$G$9$+!):G0-$N>l9g$r9MN8$9$k$H!"(Bvalbuf$B$HF1$8$@$1$N%5%$%:$,L5$1$l$P$J$j$^$;$s!#(B

$B0J9_(Bwrite()$B$KEO$7$?J8;z?t$GJ,4t$7$F$$$k$h$&$G$9!#(BOFFSET_MAN, DEVOUT_PB0$B$J$I$NCM$O2?$G$9$+!)(B

>  if (count == OFFSET_MAN){
>   __raw_writel(inval, addrMan);       // $B%O!<%I$K=PNO(B( Little Endian ) $B-!(B
> $B!!DL>o$N%O!<%I$X$N%I%i%$%P=PNO(B
> 
>  }
>  else if (count ==
> DEVOUT_PB0){                                                $B-"!!%I%i%$%P(B
> $BFb%P%C%U%!$K%G!<%?$rE>Aw(B
>   memcpy(pageBuf0 + ptReadPage, &inval, sizeof(inval));

$B$3$3$G!"(BpageBuf0$B$NHO0O$r1[$($F%3%T!<$5$l$k$3$H$O$"$j$^$;$s$+!)(B

>   ptRead++;
>  }
>  else if (count == DEVOUT_PNO){         $B!!(B                $B-#!!(B1$B2s$N(BRUN$B$K(B
> $B$*$1$k(Btimer$B!!(BClock$B$NAm?t(B
>   regNo = inval * sizeof(unsigned long);    // clkNo x 4
>  }
>  else if (count == DEVOUT_BIT){         // Bit Command     $B-$!!%S%C%HC10L(B
> $B$N(BCommand
>   printk("DEVOUT_BIT %x\n", inval);
>   // RUN$B;XNa(B
>   if ( inval & (1 << DEVBIT_RUN))
>    runFlag = true;            // Reset$B$O%I%i%$%PCf$G9T$&(B
>   // $B=i4|2=;XNa(B
>   if ( inval & (1 << DEVBIT_CLR)){       // main$BB&$K$h$k6/@)=i4|2=(B
>    ptRead = 0;                                $B!!(B// $email@hidden;;(Bread$B%]%$%s%?(BClear
>    ptWrite = 0;                                 // $email@hidden;;J'$$=P$7%]%$%s%?(B
> Clear
>   }
>  }
> $B!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&!&(B
> err2:
> kfree(valbuf);
> err1:
> up(&sem);
> return retval;
> }
> 
> $B%I%i%$%P$NDL>o5!G=-!$K%I%i%$%P$@$1$KEA$($k%l%8%9%?CM-"!$-#!"%S%C%HC10L$N(B
> Command$B-$$J$I$rDI2C$7$F$$$^$9!#(Bmain$BB&$OBP1~$7$?CM$r%I%i%$%P$KAw=P$7$^$9!#(B
> $B%3!<%I$O>JN,!#(B
> 
> $B!!$3$NAuCV$NL\E*$O%I%i%$%PB&$email@hidden$1$i$l$?%P%C%U%!#1#2#8(BKB$B$K%G!<%?$rAw$j9~(B
> $B$_!"%?%$%^!<%/%m%C%/$K1~$8$FFbMF$r=g<!J'$$=P$7$F$$$/$3$H$G$9!#(B
> 
> $B!!%I%i%$%PB&$email@hidden$1$i$l$?3d$j9~$_%O%s%I%i$O35MW$O0J2<$N$h$&$J$b$N$G$9!'(B
> 
> // timerClk$B3d$j9~$_%O%s%I%i(B
> static irqreturn_t
> timer_interrupt(int irq_timer, void *dev_id, struct pt_regs *regs)
> {
> int i;
> long slvReg1[8];
> 
> 
> IntrStatus = __raw_readl(my_addr_isr);      // isr$B$rFI$_=P$9(B
> 
> if (runFlag == true){                // RUN$B>uBV0J30$N3d$j9~$_$rL5;k$9$k(B
> $B%U%i%0(B
>  if ((ptWrite < regNo){
>   for ( i = 0; i < 4; i++){
>     slvReg1[i] = *(pageBuf0 + ptWrite);   // PageBuf 0 Data
> 
>    __raw_writel(slvReg1[i], addrAut);        // $BJ'=P!!%O!<%I$K=PNO(B $B-!!!IT(B
> $B0BDj(B
> 
>    ptWrite++;                                    // $email@hidden;;J'$$=P$7%]%$%s%?(B
> Increment
>   }
>  }
>  // $BJ'=P$7(B(RUN)$B=*N;!"<!$N%/%m%C%/(B
>  else if (ptWrite == regNo){
>   cmdDev &= ~(1 << CMDBIT_AUT);
>   __raw_writel(cmdDev, addrMan);          // $B%/%m%C%/Dd;_(BCommand
> 
>   ptWrite = 0;                // Pointer Clear
>   runFlag = false;            // $B0J9_$NJ'=P$r6X;_$9$k(BFlag
>  }
> }
>  else{
> //  $B2<5-$N%@%a2!$7$,I,MW$JM}M3$OL$2rL@!#(B
>  cmdDev &= ~(1 << CMDBIT_AUT);
>  __raw_writel(cmdDev, addrMan);           // $B%/%m%C%/Dd;_(BCommand
> }
> 
> __raw_writel(IntrStatus, my_addr_isr);       //$B!!(Bisr$B$r=q$-La$7(B
> 
> return IRQ_HANDLED;
> }
> 
> $B!!JdB-$G$9$,!"J'=P$7(BptWrite$B!"%P%C%U%!$X$NFI9~$_(BptRead$B$N%]%$%s%?$O%I%i%$(B
> $B%PB&$,4IM}!"(Bmain$BB&$O(BClear$B$9$k$3$H$,$G$-$^$9!#(B
> 
> $B!!>e5-$O#4$D$N(BLong$B%G!<%?$r(BregNo$B$KDj$a$k?t!"J'$$=P$9%W%m%0%i%`$G$9$,!"F0(B
> $B:n$NOHAH$_$OLdBj$"$j$^$;$s!#(B
> $B=jDj$N?t(BClock$B$H%G!<%?$,=PNO$5$l!"Dd;_$7$^$9!#(B

$B!VDd;_!W$H$$$&$3$H$O!"0JA0Aw$C$F$b$i$C$?%(%i!<%a%C%;!<%8(B

Oops: kernel access of bad area, sig: 11 [#1]

$B$H$O0[$J$k5sF0$K$J$C$F$$$^$9$+!)$=$l$H$b$3$N%a%C%;!<%8$,=P$FDd;_$9$k$H$$$&$3$H$G$7$g$&$+!)(B

> $BLdBj$J$N$O-!$N%9%F%C%W$G$9!#!!%O!<%I$K=PNO$9$k(B
>    __raw_writel(slvReg1[i], addrAut);
> $B$,Hs>o$KIT0BDj$J$N$G$9!#(B1,000$B%/%m%C%/$rD6$($k$H$3$m$G5!G=$7$J$/$J$j$^(B
> $B$9!#%/%m%C%/?t$OITDj$G$9!#(B

$B!VIT0BDj!W$K$J$k$N$O2?$G$7$g$&$+!)$I$N$h$&$J5sF0$K$J$k$+65$($F$$$?$@$1$^$9$+!)(B

> $B!!$$$C$?$sDd;_$9$k$HEE8;EjCG0J30$KI|5l$G$-$J$/$J$j$^$9!#(B
> 
> $B!!(Bmain$BB&$OL58B%k!<%W$r2s$C$F$$$^$9!#$3$NCf$KAK32MW0x$H;W$o$l$k(Bprintf$B$J$I(B
> $B$O$9$Y$F=|30$7$^$7$?!#$7$+$73d$j9~$_<+BN$email@hidden>o$K5!G=$7$F$$$k$N$G4X78$J$$(B
> $B$h$&$K;W$$$^$9!#(B
> 
> $B!!=email@hidden$O(BFPGA$B$N2sO)$J$N$GLdBj$"$k$H;W$($^$;$s!#(B
> 
> $B!!$O$K$+%R%s%H$,$"$l$P$*65$($/$@$5$$!#(B




suzaku メーリングリストの案内