Saanjh Sengupta <saanjhsengu...@outlook.com> writes:

> Hi,
>
> Unable to view this. Any GitHub repository diff page I could view for
> the same?

It was part of this series:

  https://patchew.org/QEMU/20241022105614.839199-1-alex.ben...@linaro.org/

Specifically this patch:

  
https://patchew.org/QEMU/20241022105614.839199-1-alex.ben...@linaro.org/20241022105614.839199-18-alex.ben...@linaro.org/

>
> Regards
> Saanjh Sengupta 
> -------------------------------------------------------------------------------------------------------------------------
> From: Alex Bennée <alex.ben...@linaro.org>
> Sent: Tuesday, March 18, 2025 1:48:01 PM
> To: Saanjh Sengupta <saanjhsengu...@outlook.com>
> Cc: Pierrick Bouvier <pierrick.bouv...@linaro.org>; Philippe Mathieu-Daudé 
> <phi...@linaro.org>; Paolo Bonzini
> <pbonz...@redhat.com>; Marc-André Lureau <marcandre.lur...@redhat.com>; 
> amir.gon...@neuroblade.ai
> <amir.gon...@neuroblade.ai>; qemu-devel@nongnu.org <qemu-devel@nongnu.org>
> Subject: Re: Building QEMU as a Shared Library 
>  
> 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

Reply via email to