Saanjh Sengupta <saanjhsengu...@outlook.com> writes: > Hi Alex, > > You mentioned about a patch series; do you have it handy with you?
Message-Id: <20241022105614.839199-18-alex.ben...@linaro.org> Date: Tue, 22 Oct 2024 11:56:11 +0100 Subject: [PATCH v2 17/20] plugins: add ability to register a GDB triggered callback From: =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.ben...@linaro.org> > > If so, could you please direct me to the same ? > > On 14 Mar 2025, at 12:11 AM, Alex Bennée <alex.ben...@linaro.org> wrote: > > Saanjh Sengupta <saanjhsengu...@outlook.com> writes: > > Hi, > > What we are trying to achieve is that the QEMU should run for a particular > number of instructions, let's say for > example > 10000 instructions and then pause it's emulation. After a resume trigger is > received to the QEMU it must resume it's > emulation and start the instruction count from 10001 (which basically > means that the context should be saved). > > I think you want to run under icount and you will need to modify the > trigger plugin. Under icount we run each vCPU in turn, so if the plugin > pauses the vCPU will de-facto be paused. > > You would have to implement some sort of control interface in the > plugin. Or you could add an API to trigger the gdbstub. I think I had > that on a patch series at one point. > > In the previous mail when you mentioned g_usleep, I believe this shall not > work (as per our use-case) since it will > reset the > instruction count to 0 (as per what you mentioned). > > To achieve the use-case, do you have any leads/suggestions ? > > Regards > Saanjh Sengupta > > > ------------------------------------------------------------------------------------------------------------------------- > From: Pierrick Bouvier <pierrick.bouv...@linaro.org> > Sent: Wednesday, March 12, 2025 11:50:23 am > To: Saanjh Sengupta <saanjhsengu...@outlook.com>; Philippe Mathieu-Daudé > <phi...@linaro.org>; Paolo Bonzini > <pbonz...@redhat.com>; Marc-André Lureau <marcandre.lur...@redhat.com> > Cc: amir.gon...@neuroblade.ai <amir.gon...@neuroblade.ai>; > qemu-devel@nongnu.org > <qemu-devel@nongnu.org>; Alex > Bennée <alex.ben...@linaro.org> > Subject: Re: Building QEMU as a Shared Library > > On 3/11/25 21:31, Saanjh Sengupta wrote: > > Hi, > > Thank you for the clarification. Regarding the last time > /"Stoptrigger might be a better fit for what you want to do, and instead > of exiting, you want to resume emulation after N insn. The function > qemu_clock_advance_virtual_time() can only be used to move the time > forward, and you can not stop the "virtual time" by design."/ > / > / > I did not quite understand this. Even if I have to modify the > stopTrigger plugin, I would want it to pause rather than exiting. > For example: It gets 10000 instructions executed after that it should > pause and after some time it should then resume again execute till 20000 > instructions (because previously it executed till 10000 and then it must > execute till 20000). How do I do this? How do I state the code to pause > the qemu's emulation after 10000 instructions? > > By using g_usleep to pause the current cpu. > As well, it's needed to reset insn_count to 0 to count instructions again. > > With this command line: > ./build/qemu-system-x86_64 -plugin > ./build/contrib/plugins/libstoptrigger.so,icount=1000 -d plugin > > And with those changes to stoptrigger: > > diff --git a/contrib/plugins/stoptrigger.c b/contrib/plugins/stoptrigger.c > index b3a6ed66a7b..77fd413cef1 100644 > --- a/contrib/plugins/stoptrigger.c > +++ b/contrib/plugins/stoptrigger.c > @@ -41,11 +41,12 @@ typedef struct { > int exit_code; > } ExitInfo; > > -static void exit_emulation(int return_code, char *message) > +static void pause_emulation(int return_code, char *message) > { > qemu_plugin_outs(message); > g_free(message); > - exit(return_code); > + /* exit(return_code); */ > + g_usleep(1 * G_USEC_PER_SEC); > } > > static void exit_icount_reached(unsigned int cpu_index, void *udata) > @@ -53,7 +54,9 @@ static void exit_icount_reached(unsigned int > cpu_index, void *udata) > uint64_t insn_vaddr = qemu_plugin_u64_get(current_pc, cpu_index); > char *msg = g_strdup_printf("icount reached at 0x%" PRIx64 ", > exiting\n", > insn_vaddr); > - exit_emulation(icount_exit_code, msg); > + pause_emulation(icount_exit_code, msg); > + /* reset instruction counter */ > + qemu_plugin_u64_set(insn_count, cpu_index, 0); > } > > static void exit_address_reached(unsigned int cpu_index, void *udata) > @@ -61,7 +64,7 @@ static void exit_address_reached(unsigned int > cpu_index, void *udata) > ExitInfo *ei = udata; > g_assert(ei); > char *msg = g_strdup_printf("0x%" PRIx64 " reached, exiting\n", > ei->exit_addr); > - exit_emulation(ei->exit_code, msg); > + pause_emulation(ei->exit_code, msg); > } > > Moreover, I tried an activity where I was utilising the QMP protocol to > control the virtual time (with respect to the IPS plugin). In that > context when the QMP stop is triggered, my virtual time does got freezed > until the resume is triggered. Does this mean I am able to manipulate > the virtual time of the QEMU? > > I am not sure of how it works, but the plugin interface only allows to > move time forward. > > Regards > Saanjh Sengupta > ------------------------------------------------------------------------ > *From:* Pierrick Bouvier <pierrick.bouv...@linaro.org> > *Sent:* Wednesday, March 12, 2025 2:14:47 AM > *To:* Saanjh Sengupta <saanjhsengu...@outlook.com>; Philippe Mathieu- > Daudé <phi...@linaro.org>; Paolo Bonzini <pbonz...@redhat.com>; Marc- > André Lureau <marcandre.lur...@redhat.com> > *Cc:* amir.gon...@neuroblade.ai <amir.gon...@neuroblade.ai>; qemu- > de...@nongnu.org <qemu-devel@nongnu.org>; Alex Bennée > <alex.ben...@linaro.org> > *Subject:* Re: Building QEMU as a Shared Library > On 3/11/25 02:50, Saanjh Sengupta wrote: > > Hi, > > I have a couple of questions: > > 1. > When I use the libstoptrigger.so: in that case the QEMU 's emulation > stops after executing the defined number of instructions. Post this, > the whole QEMU terminates. And while using the libips.so I am > assuming that the QEMU doesn't execute no more than the defined > instructions. Please correct me if I am wrong. > > That's correct for both plugins, with the additional note that libips > does this per second only. > > 2. > In my case, I want the QEMU to start emulation for some time and > PAUSE it's emulation for some time; after it is Paused (it's virtual > time is also to be paused) and then let's say for after 'x' time > period it should resume it's virtual time. > > The virtual time variable in ips plugin is only related to this plugin, > and based on how many instructions have been executed, which is > different from what you want to achieve. > > Stoptrigger might be a better fit for what you want to do, and instead > of exiting, you want to resume emulation after N insn. > The function qemu_clock_advance_virtual_time() can only be used to move > the time forward, and you can not stop the "virtual time" by design. > > image > > I have added this segment inside the update_system_time function inside > the ipsPlugin.c. but once the instructions reach to the defined limit > the virtual time does not seem to stop. > Do you have any suggestions on that front? > > Regards > Saanjh Sengupta > ------------------------------------------------------------------------ > *From:* Pierrick Bouvier <pierrick.bouv...@linaro.org> > *Sent:* Wednesday, March 5, 2025 5:20:38 AM > *To:* Saanjh Sengupta <saanjhsengu...@outlook.com>; Philippe Mathieu- > Daudé <phi...@linaro.org>; Paolo Bonzini <pbonz...@redhat.com>; Marc- > André Lureau <marcandre.lur...@redhat.com> > *Cc:* amir.gon...@neuroblade.ai <amir.gon...@neuroblade.ai>; qemu- > de...@nongnu.org <qemu-devel@nongnu.org>; Alex Bennée > <alex.ben...@linaro.org> > *Subject:* Re: Building QEMU as a Shared Library > Hi Saanjh, > > depending what you are trying to achieve exactly, plugins can provide a > solution. It's convenient and you can stay on top of QEMU upstream, > without having to create a downstream fork. > > We already have plugins for stopping after a given number of > instructions, or slow down execution of a VM: > > # stop after executing 1'000'000 instructions: > $ ./build/qemu-system-x86_64 -plugin > ./build/contrib/plugins/libstoptrigger,icount=1000000 -d plugin > > # execute no more than 1'000'000 instructions per second: > $ ./build/qemu-system-x86_64 -plugin > ./build/contrib/plugins/libips.so,ips=1000000 -d plugin > > You can see source code associated (./contrib/plugins/stoptrigger.c and > ./contrib/plugins/ips.c), to implement something similar to what you > want, but based on time. > Would that satisfy your need? > > Regards, > Pierrick > > On 3/3/25 21:53, Saanjh Sengupta wrote: > > Hi, > > Thank you so much for your inputs. I was able to create the .so file of > QEMU. > > Actually, what we are trying is to understand and explore possibilities > of Virtual Time Control in QEMU. In short, what I mean to say is an > approach via which I can tell QEMU to emulate for XYZ time when the I > give a trigger and then pause the emulation by itself after the XYZ time > is completed. > > On that front itself, do you have any inputs/ideas regarding the same? > > Regards > Saanjh Sengupta > ------------------------------------------------------------------------ > *From:* Pierrick Bouvier <pierrick.bouv...@linaro.org> > *Sent:* Tuesday, February 25, 2025 6:29:44 AM > *To:* Philippe Mathieu-Daudé <phi...@linaro.org>; Paolo Bonzini > <pbonz...@redhat.com>; Marc-André Lureau <marcandre.lur...@redhat.com> > *Cc:* amir.gon...@neuroblade.ai <amir.gon...@neuroblade.ai>; qemu- > de...@nongnu.org <qemu-devel@nongnu.org>; Saanjh Sengupta > <saanjhsengu...@outlook.com> > *Subject:* Re: Building QEMU as a Shared Library > Hi Saanjh, > > here is a minimal patch that builds one shared library per target (arch, > mode) where arch is cpu arch, and mode is system or user, and launch > system-aarch64 through a simple driver: > > https://github.com/pbo-linaro/qemu/commit/ <https://github.com/pbo- > > linaro/qemu/commit/> <https://github.com/pbo- > > linaro/qemu/commit/> > > fbb39cc64f77d4bf1e5e50795c75b62735bf5c5f <https://github.com/pbo-linaro/ > qemu/commit/fbb39cc64f77d4bf1e5e50795c75b62735bf5c5f> > > With this, it could be possible to create a driver that can execute any > existing target. It's a sort of single binary for QEMU, but shared > objects are mandatory, and duplicates all the QEMU state. So there is no > real benefit compared to having different processes. > > In more, to be able to do concurrent emulations, there are much more > problems to be solved. QEMU state is correctly kept per target, but all > other libraries states are shared. There are various issues if you > launch two emulations at the same time in two threads: > - glib global context > - qemu calls exit in many places, which stops the whole process > - probably other things I didn't explore > > At this point, even though qemu targets can be built as shared objects, > I would recommend to use different processes, and implement some form on > IPC to synchronize all this. > Another possibility is to try to build machines without using the > existing main, but I'm not sure it's worth all the hassle. > > What are you trying to achieve? > > Regards, > Pierrick > > On 2/24/25 01:10, Philippe Mathieu-Daudé wrote: > > Cc'ing our meson experts > > On 22/2/25 14:36, Saanjh Sengupta wrote: > > Hi, > > I referred to your mailing chains on suggesting QEMU to be built as a > shared library. > > *Change meson.build to build QEMU as a shared library (with PIC enabled > for static libraries)* > * > * > Could you please suggest what exactly has to be enabled in the meson.build? > > I am confused on that front. > > Regards > Saanjh Sengupta > > -- > Alex Bennée > Virtualisation Tech Lead @ Linaro -- Alex Bennée Virtualisation Tech Lead @ Linaro