<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
This is my function :<br>
<br>static spinlock_t xgr_learn_lock = SPIN_LOCK_UNLOCKED;<br>
static int piga_seq_cpt = 1;<br><br>/*<br>* Function called for each systemcall (Hook SELinux avc function)<br>*/<br>int piga_control(u32 ssid, ...., struct av_decision * avd) {<br><br>/*<br><div>* Here my hypercall work but block my vm with this error :<br>
* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " BUG: scheduling while atomic ... "<br>*/<br><br>spin_lock_bh(&amp;xgr_learn_lock);<br>
&nbsp; if ( in_atomic())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned long)piga_seq_cpt);<br>
&nbsp; spin_unlock_bh(&amp;xgr_learn_lock);&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;if (piga_on == 1) {<br>
/*<br>* Here my hypercall make a kernel panic with this error:<br>* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " divide error: 0000 [#1] SMP"<br>*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_bh(&amp;xgr_learn_lock);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_current_state(TASK_UNINTERRUPTIBLE);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned long)piga_seq_cpt);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_current_state(TASK_RUNNING);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spin_lock_bh(&amp;xgr_learn_lock);<br>
}<br>
}<br><br></div>&gt; Date: Wed, 8 Jun 2011 12:50:57 +0200<br>&gt; From: kernelnewbies@mail.i88.de<br>&gt; To: kernelnewbies@kernelnewbies.org<br>&gt; Subject: Re: Calling function from address<br>&gt; CC: mulyadi.santosa@gmail.com<br>&gt; <br>&gt; On Wed, Jun 08, 2011 at 04:52:14PM +0700, Mulyadi Santosa wrote:<br>&gt; &gt; On Wed, Jun 8, 2011 at 03:47, Micha M. &lt;kernelnewbies@mail.i88.de&gt; wrote:<br>&gt; &gt; &gt; Hi!<br>&gt; &gt; &gt;<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; Is it possible to call a function that is somewere in the physical-address<br>&gt; &gt; &gt; space? So I'd like to jump to a certain physical address, execute the code<br>&gt; &gt; &gt; there and then return to my kernel module.<br>&gt; &gt; &gt; I already tried to ioremap that address and cast the new address to a<br>&gt; &gt; &gt; funtion pointer and then call the function, but there where some page<br>&gt; &gt; &gt; faults.<br>&gt; &gt; <br>&gt; &gt; Interesting, and after page fault....the code is still not executed?<br>&gt; &gt; <br>&gt; &gt; what code(s) do you call? user mode? kernel mode?<br>&gt; <br>&gt; I don't think that the code was executed. There was a kernel Ooops direct<br>&gt; after the page fault and a register dump was printed. The code I what to<br>&gt; call is located in ROM and is mapped to the physical address space. <br>&gt; Is it possible to configure the kernel to ignore certain address areas and<br>&gt; allow calls to that space?<br>&gt; <br>&gt; And that code needs to be executed from that place, since it contains<br>&gt; pointer in the physical address space. (s oremapping won't work because<br>&gt; there are absolute jumps in that function I'd like to call)<br>&gt; <br>&gt; The only solution I kan think of at the moment is to solve it somehow in<br>&gt; assembly. But I don't know how...<br>&gt; <br>&gt; <br>&gt; regards,<br>&gt; <br>&gt; #micha<br>&gt; <br>&gt; -- <br>&gt; /* To err is human; to really fuck things up requires the root password */<br>&gt; <br>&gt; _______________________________________________<br>&gt; Kernelnewbies mailing list<br>&gt; Kernelnewbies@kernelnewbies.org<br>&gt; http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies<br>                                               </body>
</html>