From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: New Hypercall Declaration Date: Thu, 07 Oct 2010 20:11:14 +0100 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Dan Magenheimer , "Nimgaonkar, Satyajeet" , xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org And furthermore, do_jeet() needs to return a long, not void. -- Keir On 07/10/2010 19:07, "Dan Magenheimer" wrote: > The hypercall_table and hypercall_args_table are initialized sequences of > quads and bytes. Even though you have put 56 in the comment, you are > initializing the table entry immediately following the 48th entry, which = would > be hypercall 49. You need to fill the entries from 49 to 55 in both tabl= es > with the appropriate values. (The assembler syntax for these tables is w= eird, > e.g. endr and rept, and I am not an expert on it.) > =20 >=20 > From: Nimgaonkar, Satyajeet [mailto:SatyajeetNimgaonkar@my.unt.edu] > Sent: Thursday, October 07, 2010 11:37 AM > To: Dan Magenheimer; xen-devel@lists.xensource.com > Subject: RE: [Xen-devel] New Hypercall Declaration > =20 >=20 > Hi Dan, > I followed your instruction from the below email, but still I = am > getting -1 for hypercall invocation. These are the steps I followed. >=20 > 1. Add my hypercall in xen.h ---- #define __HYPERVISOR_jeet1 > 56 >=20 > 2. Added it to entry.S - hypercall table ---- .quad do_mca = /* 48 > */ > .quad > do_jeet1 /* 56 */ > - hypercall_args_table ---- .byte 1 /* d= o_mca > */ /* 48 */ > =20 > .byte 0 /* do_jeet1 */ /* 56 */ >=20 > 3. Then declared my hypercall in asm-x86/hypercall.h ---- void do_jeet1(v= oid); >=20 > 4. Then calling it in domctl.c in xen/common --- void do_jeet1(void){ > =20 > printk ("Successfull Hypercall made to __HYPERVISOR_jeet1"); > =20 > } >=20 > 5. Declared a function in xc_domain.c in xen/tools to call this hypercall >=20 > int hypercall_test(int handle){ > =20 > int rc; > int arg=3D0;=20 > //int cmd=3D1; > // > //int test; > /* Hypercall definitions */ > =20 > DECLARE_HYPERCALL; > hypercall.op =3D __HYPERVISOR_jeet1; > rc =3D do_xen_hypercall(handle, &hypercall); > hypercall.arg[0] =3D 0; > hypercall.arg[1] =3D (unsigned long)&arg; > //printf ("Hypercall Details: %d\n", rc); > //xc_interface_close(handle); > return rc; > } >=20 > 6. Then wrote a userlevel program to call function hypercall_test and inv= oke > my hypercall. >=20 > #include > #include >=20 >=20 >=20 > int main(){ > =20 > printf("Attempt to invoke the hypercall: __HYPERVISOR_jeet1\n"); > int handle, rc; > =20 > /* Acquire Hypervisor Interface Handle. > This handle goes as the first argument for the function > do_xen_hypercall() > */ > =20 > handle =3D xc_interface_open(); > printf ("Acquired handle to Xen Hypervisor:%d\n",handle); > =20 > =20 > rc =3D hypercall_test(handle); > printf ("Hypercall Details: %d\n", rc); > =20 > xc_interface_close(handle); > printf ("Hypervisor handle closed\n"); > =20 > return 0; > =20 > } >=20 >=20 > I compiled entire xen, installed it and booted into the atest compiled xe= n. > But still my userlevel program compiles error free but returns me a -1 er= ror > for hypercall invocation. Can you please tell me what is that I doing wro= ng. > Thanks. >=20 > Regards, > Satyajeet Nimgaonkar >=20 >=20 > From: Dan Magenheimer [dan.magenheimer@oracle.com] > Sent: Thursday, September 30, 2010 4:47 PM > To: Nimgaonkar, Satyajeet; xen-devel@lists.xensource.com > Subject: RE: [Xen-devel] New Hypercall Declaration >=20 > Do you understand that you must also change the hypervisor to recognize a= nd do > something with your new hypercall? Your userland code may actually be wo= rking > and the hypercall may actually be resulting in an entry into the hypervis= or, > but unless the hypervisor is modified to recognize the new hypercall (#56= ) and > do something with it, the hypervisor will generate a return value of -1 > (essentially saying =B3I don=B9t recognize this hypercall number=B2). > =20 > If you have modified the hypervisor, please share that patch. If not, yo= u > will need to modify at least the hypercall_table and the hypercall_args_= table > in entry.S (under x86, x86_64, and x86_64/compat, or all three, depending= on > the bit-ness of your hypervisor and guest) and create a do_my_hypercall() > routine somewhere. Then of course you will need to ensure that you are > properly building, installing, and booting your newly modified hypervisor= . > =20 > Printk=B9s done inside the hypervisor can be viewed using =B3xm dmesg=B2 or via= a > properly configured serial port. > =20 > Use =B3xm info=B2 and look at cc_compile_date to ensure you are booting your = newly > modified hypervisor. > =20 > Hope that helps, > Dan > =20 >=20 > From: Nimgaonkar, Satyajeet [mailto:SatyajeetNimgaonkar@my.unt.edu] > Sent: Thursday, September 30, 2010 4:03 PM > To: xen-devel@lists.xensource.com > Subject: [Xen-devel] New Hypercall Declaration > =20 >=20 > Hello Xen Developers, >=20 > I am currently working on declaring a new hypercall in Xen. > For this i have declared my hypercall in xen.h - > #define __HYPERVISOR_jeet1 56 >=20 > Then I modified the xcom_privcmd.c to accomodate my hypercall - > case __HYPERVISOR_jeet1: > printk("Successfull Hypercall made to > __HYPERVISOR_jeet1"); >=20 > I defined the structure for the Hypercall in xc_domain.c >=20 > int hypercall_test(int handle){ > =20 > int rc;=20 > =20 > /* Hypercall definitions */ > =20 > DECLARE_HYPERCALL; > hypercall.op =3D __HYPERVISOR_jeet1; > rc =3D do_xen_hypercall(handle, &hypercall); > hypercall.arg[0] =3D 0; > hypercall.arg[1] =3D 1; > //printf ("Hypercall Details: %d\n", rc); > //xc_interface_close(handle); > return rc;=20 > } >=20 > And then I am calling this Hypercall through an user level program- > =20 > #include > #include >=20 >=20 >=20 > int main(){ > =20 > printf("Attempt to invoke the hypercall: __HYPERVISOR_jeet1\n"); > int handle, rc; > =20 > /* Acquire Hypervisor Interface Handle. > This handle goes as the first argument for the function > do_xen_hypercall() > */ > =20 > handle =3D xc_interface_open(); > printf ("Acquired handle to Xen Hypervisor:%d\n",handle); > =20 > =20 > rc =3D hypercall_test(handle); > printf ("Hypercall Details: %d\n", rc); > =20 > xc_interface_close(handle); > =20 > return 0; > =20 > } >=20 >=20 > The program compiles properly but gives me -1 error for rc. I have posted= the > same query and I got replies on it. But even after trying many things, I = am > still stuck with this problem. Can anyone please tell me what I am doing = wrong > here. Also please tell me where > should I view the output of printk in xen. >=20 > Thanks in advance. >=20 > Regards, > Satyajeet Nimgaonkar >=20 >=20 > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel