Calling function from address

emilie lefebvre tricheurs at hotmail.fr
Wed Jun 8 10:49:25 EDT 2011


This is my function :


static spinlock_t xgr_learn_lock = SPIN_LOCK_UNLOCKED;

static int piga_seq_cpt = 1;

/*
* Function called for each systemcall (Hook SELinux avc function)
*/
int piga_control(u32 ssid, ...., struct av_decision * avd) {

/*
* Here my hypercall work but block my vm with this error :

*                " BUG: scheduling while atomic ... "
*/

spin_lock_bh(&xgr_learn_lock);

  if ( in_atomic())

           kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned long)piga_seq_cpt);

  spin_unlock_bh(&xgr_learn_lock);   

    

 if (piga_on == 1) {

/*
* Here my hypercall make a kernel panic with this error:
*             " divide error: 0000 [#1] SMP"
*/
                spin_lock_bh(&xgr_learn_lock);

                set_current_state(TASK_UNINTERRUPTIBLE);

                kvm_hypercall2 ( 6, (unsigned long)2 ,(unsigned long)piga_seq_cpt);

                set_current_state(TASK_RUNNING);

                spin_lock_bh(&xgr_learn_lock);

}

}

> Date: Wed, 8 Jun 2011 12:50:57 +0200
> From: kernelnewbies at mail.i88.de
> To: kernelnewbies at kernelnewbies.org
> Subject: Re: Calling function from address
> CC: mulyadi.santosa at gmail.com
> 
> On Wed, Jun 08, 2011 at 04:52:14PM +0700, Mulyadi Santosa wrote:
> > On Wed, Jun 8, 2011 at 03:47, Micha M. <kernelnewbies at mail.i88.de> wrote:
> > > Hi!
> > >
> > >
> > > Is it possible to call a function that is somewere in the physical-address
> > > space? So I'd like to jump to a certain physical address, execute the code
> > > there and then return to my kernel module.
> > > I already tried to ioremap that address and cast the new address to a
> > > funtion pointer and then call the function, but there where some page
> > > faults.
> > 
> > Interesting, and after page fault....the code is still not executed?
> > 
> > what code(s) do you call? user mode? kernel mode?
> 
> I don't think that the code was executed. There was a kernel Ooops direct
> after the page fault and a register dump was printed. The code I what to
> call is located in ROM and is mapped to the physical address space. 
> Is it possible to configure the kernel to ignore certain address areas and
> allow calls to that space?
> 
> And that code needs to be executed from that place, since it contains
> pointer in the physical address space. (s oremapping won't work because
> there are absolute jumps in that function I'd like to call)
> 
> The only solution I kan think of at the moment is to solve it somehow in
> assembly. But I don't know how...
> 
> 
> regards,
> 
> #micha
> 
> -- 
> /* To err is human; to really fuck things up requires the root password */
> 
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110608/3a441ecd/attachment-0001.html 


More information about the Kernelnewbies mailing list