* [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) @ 2021-06-25 7:38 Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 1/2] g364fb: use RAM memory region for framebuffer Mark Cave-Ayland ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 7:38 UTC (permalink / raw) To: qemu-devel, f4bug, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain I noticed whilst testing the previous dp8393x patchset that I would always get a segfault whilst attempting to migrate the MIPS magnum machine. A bit of detective work shows that the problem is an incorrect VMStateDescription in the g364fb device which expects a G364State but instead receives a G364SysBusState. Looking back through the git history suggests that migration for this device (and also the MIPS magnum machines) has been broken for several years, so patch 1 takes the opportunity to improve the migration stream for the framebuffer first whilst patch 2 contains the actual fix. Note that I don't use the MIPS magnum machines on a regular basis but the patchset fixes the migration error and survives some light testing here. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Mark Cave-Ayland (2): g364fb: use RAM memory region for framebuffer g364fb: add VMStateDescription for G364SysBusState hw/display/g364fb.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] g364fb: use RAM memory region for framebuffer 2021-06-25 7:38 [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland @ 2021-06-25 7:38 ` Mark Cave-Ayland 2021-06-25 8:37 ` Philippe Mathieu-Daudé 2021-06-25 7:38 ` [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState Mark Cave-Ayland 2021-06-25 16:37 ` [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2 siblings, 1 reply; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 7:38 UTC (permalink / raw) To: qemu-devel, f4bug, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain Since the migration stream is already broken, we can use this opportunity to change the framebuffer so that it is migrated as a RAM memory region rather than as an array of bytes. In particular this helps the output of the analyze-migration.py tool which no longer contains a huge array representing the framebuffer contents. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> --- hw/display/g364fb.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c index 8f1725432c..163d7f5391 100644 --- a/hw/display/g364fb.c +++ b/hw/display/g364fb.c @@ -22,6 +22,7 @@ #include "hw/hw.h" #include "hw/irq.h" #include "hw/qdev-properties.h" +#include "qapi/error.h" #include "qemu/error-report.h" #include "qemu/module.h" #include "ui/console.h" @@ -125,7 +126,7 @@ static void g364fb_draw_graphic8(G364State *s) xcursor = ycursor = -65; } - vram = s->vram + s->top_of_screen; + vram = memory_region_get_ram_ptr(&s->mem_vram) + s->top_of_screen; /* XXX: out of range in vram? */ data_display = dd = surface_data(surface); snap = memory_region_snapshot_and_clear_dirty(&s->mem_vram, 0, s->vram_size, @@ -274,6 +275,8 @@ static inline void g364fb_invalidate_display(void *opaque) static void g364fb_reset(G364State *s) { + uint8_t *vram = memory_region_get_ram_ptr(&s->mem_vram); + qemu_irq_lower(s->irq); memset(s->color_palette, 0, sizeof(s->color_palette)); @@ -283,7 +286,7 @@ static void g364fb_reset(G364State *s) s->ctla = 0; s->top_of_screen = 0; s->width = s->height = 0; - memset(s->vram, 0, s->vram_size); + memset(vram, 0, s->vram_size); g364fb_invalidate_display(s); } @@ -454,7 +457,6 @@ static const VMStateDescription vmstate_g364fb = { .minimum_version_id = 1, .post_load = g364fb_post_load, .fields = (VMStateField[]) { - VMSTATE_VBUFFER_UINT32(vram, G364State, 1, NULL, vram_size), VMSTATE_BUFFER_UNSAFE(color_palette, G364State, 0, 256 * 3), VMSTATE_BUFFER_UNSAFE(cursor_palette, G364State, 0, 9), VMSTATE_UINT16_ARRAY(cursor, G364State, 512), @@ -474,15 +476,12 @@ static const GraphicHwOps g364fb_ops = { static void g364fb_init(DeviceState *dev, G364State *s) { - s->vram = g_malloc0(s->vram_size); - s->con = graphic_console_init(dev, 0, &g364fb_ops, s); memory_region_init_io(&s->mem_ctrl, OBJECT(dev), &g364fb_ctrl_ops, s, "ctrl", 0x180000); - memory_region_init_ram_ptr(&s->mem_vram, NULL, "vram", - s->vram_size, s->vram); - vmstate_register_ram(&s->mem_vram, dev); + memory_region_init_ram(&s->mem_vram, NULL, "g364fb.vram", s->vram_size, + &error_fatal); memory_region_set_log(&s->mem_vram, true, DIRTY_MEMORY_VGA); } -- 2.20.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] g364fb: use RAM memory region for framebuffer 2021-06-25 7:38 ` [PATCH 1/2] g364fb: use RAM memory region for framebuffer Mark Cave-Ayland @ 2021-06-25 8:37 ` Philippe Mathieu-Daudé 2021-06-25 11:52 ` Mark Cave-Ayland 0 siblings, 1 reply; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2021-06-25 8:37 UTC (permalink / raw) To: Mark Cave-Ayland, qemu-devel, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 6/25/21 9:38 AM, Mark Cave-Ayland wrote: > Since the migration stream is already broken, we can use this opportunity to > change the framebuffer so that it is migrated as a RAM memory region rather > than as an array of bytes. > > In particular this helps the output of the analyze-migration.py tool which > no longer contains a huge array representing the framebuffer contents. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > --- > hw/display/g364fb.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > @@ -454,7 +457,6 @@ static const VMStateDescription vmstate_g364fb = { > .minimum_version_id = 1, Even if broken, I'd increase to version as good practice. > .post_load = g364fb_post_load, > .fields = (VMStateField[]) { > - VMSTATE_VBUFFER_UINT32(vram, G364State, 1, NULL, vram_size), > VMSTATE_BUFFER_UNSAFE(color_palette, G364State, 0, 256 * 3), > VMSTATE_BUFFER_UNSAFE(cursor_palette, G364State, 0, 9), > VMSTATE_UINT16_ARRAY(cursor, G364State, 512), The vram pointer is now unused, we can remove it: -- >8 -- diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c index 990ef3afdd8..11ad61fa73a 100644 --- a/hw/display/g364fb.c +++ b/hw/display/g364fb.c @@ -34,7 +34,6 @@ typedef struct G364State { /* hardware */ - uint8_t *vram; uint32_t vram_size; qemu_irq irq; MemoryRegion mem_vram; --- Removing 'uint8_t *vram': Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] g364fb: use RAM memory region for framebuffer 2021-06-25 8:37 ` Philippe Mathieu-Daudé @ 2021-06-25 11:52 ` Mark Cave-Ayland 0 siblings, 0 replies; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 11:52 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 25/06/2021 09:37, Philippe Mathieu-Daudé wrote: > On 6/25/21 9:38 AM, Mark Cave-Ayland wrote: >> Since the migration stream is already broken, we can use this opportunity to >> change the framebuffer so that it is migrated as a RAM memory region rather >> than as an array of bytes. >> >> In particular this helps the output of the analyze-migration.py tool which >> no longer contains a huge array representing the framebuffer contents. >> >> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> --- >> hw/display/g364fb.c | 15 +++++++-------- >> 1 file changed, 7 insertions(+), 8 deletions(-) > >> @@ -454,7 +457,6 @@ static const VMStateDescription vmstate_g364fb = { >> .minimum_version_id = 1, > > Even if broken, I'd increase to version as good practice. Sure - I'll go ahead and do that for a v2. The reason I wasn't too worried was because since the wrong struct is used for saving data, the outgoing stream is corrupted so all bets are off on being able to reload it(!). >> .post_load = g364fb_post_load, >> .fields = (VMStateField[]) { >> - VMSTATE_VBUFFER_UINT32(vram, G364State, 1, NULL, vram_size), >> VMSTATE_BUFFER_UNSAFE(color_palette, G364State, 0, 256 * 3), >> VMSTATE_BUFFER_UNSAFE(cursor_palette, G364State, 0, 9), >> VMSTATE_UINT16_ARRAY(cursor, G364State, 512), > > The vram pointer is now unused, we can remove it: Indeed. I remember thinking I had to do this, but clearly forgot. Will fix. > -- >8 -- > diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c > index 990ef3afdd8..11ad61fa73a 100644 > --- a/hw/display/g364fb.c > +++ b/hw/display/g364fb.c > @@ -34,7 +34,6 @@ > > typedef struct G364State { > /* hardware */ > - uint8_t *vram; > uint32_t vram_size; > qemu_irq irq; > MemoryRegion mem_vram; > --- > > Removing 'uint8_t *vram': > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> ATB, Mark. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState 2021-06-25 7:38 [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 1/2] g364fb: use RAM memory region for framebuffer Mark Cave-Ayland @ 2021-06-25 7:38 ` Mark Cave-Ayland 2021-06-25 8:44 ` Philippe Mathieu-Daudé 2021-06-25 16:37 ` [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2 siblings, 1 reply; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 7:38 UTC (permalink / raw) To: qemu-devel, f4bug, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain Currently when QEMU attempts to migrate the MIPS magnum machine it crashes due to a mistake in the g364fb VMStateDescription configuration which expects a G364SysBusState and not a G364State. Resolve the issue by adding a new VMStateDescription for G364SysBusState and embedding the existing vmstate_g364fb VMStateDescription inside it using VMSTATE_STRUCT. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> --- hw/display/g364fb.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c index 163d7f5391..990ef3afdd 100644 --- a/hw/display/g364fb.c +++ b/hw/display/g364fb.c @@ -518,6 +518,16 @@ static Property g364fb_sysbus_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const VMStateDescription vmstate_g364fb_sysbus = { + .name = "g364fb-sysbus", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_STRUCT(g364, G364SysBusState, 1, vmstate_g364fb, G364State), + VMSTATE_END_OF_LIST() + } +}; + static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -526,7 +536,7 @@ static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); dc->desc = "G364 framebuffer"; dc->reset = g364fb_sysbus_reset; - dc->vmsd = &vmstate_g364fb; + dc->vmsd = &vmstate_g364fb_sysbus; device_class_set_props(dc, g364fb_sysbus_properties); } -- 2.20.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState 2021-06-25 7:38 ` [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState Mark Cave-Ayland @ 2021-06-25 8:44 ` Philippe Mathieu-Daudé 2021-06-25 11:57 ` Mark Cave-Ayland 0 siblings, 1 reply; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2021-06-25 8:44 UTC (permalink / raw) To: Mark Cave-Ayland, qemu-devel, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 6/25/21 9:38 AM, Mark Cave-Ayland wrote: > Currently when QEMU attempts to migrate the MIPS magnum machine it crashes due > to a mistake in the g364fb VMStateDescription configuration which expects a > G364SysBusState and not a G364State. > > Resolve the issue by adding a new VMStateDescription for G364SysBusState and > embedding the existing vmstate_g364fb VMStateDescription inside it using > VMSTATE_STRUCT. Broken since 97a3f6ffbba ("g364fb: convert to qdev")? > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > --- > hw/display/g364fb.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c > index 163d7f5391..990ef3afdd 100644 > --- a/hw/display/g364fb.c > +++ b/hw/display/g364fb.c > @@ -518,6 +518,16 @@ static Property g364fb_sysbus_properties[] = { > DEFINE_PROP_END_OF_LIST(), > }; > > +static const VMStateDescription vmstate_g364fb_sysbus = { > + .name = "g364fb-sysbus", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_STRUCT(g364, G364SysBusState, 1, vmstate_g364fb, G364State), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > @@ -526,7 +536,7 @@ static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) > set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); > dc->desc = "G364 framebuffer"; > dc->reset = g364fb_sysbus_reset; > - dc->vmsd = &vmstate_g364fb; > + dc->vmsd = &vmstate_g364fb_sysbus; > device_class_set_props(dc, g364fb_sysbus_properties); > } > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState 2021-06-25 8:44 ` Philippe Mathieu-Daudé @ 2021-06-25 11:57 ` Mark Cave-Ayland 0 siblings, 0 replies; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 11:57 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 25/06/2021 09:44, Philippe Mathieu-Daudé wrote: > On 6/25/21 9:38 AM, Mark Cave-Ayland wrote: >> Currently when QEMU attempts to migrate the MIPS magnum machine it crashes due >> to a mistake in the g364fb VMStateDescription configuration which expects a >> G364SysBusState and not a G364State. >> >> Resolve the issue by adding a new VMStateDescription for G364SysBusState and >> embedding the existing vmstate_g364fb VMStateDescription inside it using >> VMSTATE_STRUCT. > > Broken since 97a3f6ffbba ("g364fb: convert to qdev")? (goes and looks) Wow that does appear to be correct - I gave up looking when I got to 8 years ago ;) But yes, the bug is introduced by that commit: before you can see that register_savevm() was called with a G364State opaque whereas after the switch to QOM object the object reference for the VMStateDescription becomes G364SysBusState instead. I'll add a "Fixes:" tag and send again. >> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> --- >> hw/display/g364fb.c | 12 +++++++++++- >> 1 file changed, 11 insertions(+), 1 deletion(-) >> >> diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c >> index 163d7f5391..990ef3afdd 100644 >> --- a/hw/display/g364fb.c >> +++ b/hw/display/g364fb.c >> @@ -518,6 +518,16 @@ static Property g364fb_sysbus_properties[] = { >> DEFINE_PROP_END_OF_LIST(), >> }; >> >> +static const VMStateDescription vmstate_g364fb_sysbus = { >> + .name = "g364fb-sysbus", >> + .version_id = 1, >> + .minimum_version_id = 1, >> + .fields = (VMStateField[]) { >> + VMSTATE_STRUCT(g364, G364SysBusState, 1, vmstate_g364fb, G364State), >> + VMSTATE_END_OF_LIST() >> + } >> +}; >> + >> static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) >> { >> DeviceClass *dc = DEVICE_CLASS(klass); >> @@ -526,7 +536,7 @@ static void g364fb_sysbus_class_init(ObjectClass *klass, void *data) >> set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); >> dc->desc = "G364 framebuffer"; >> dc->reset = g364fb_sysbus_reset; >> - dc->vmsd = &vmstate_g364fb; >> + dc->vmsd = &vmstate_g364fb_sysbus; >> device_class_set_props(dc, g364fb_sysbus_properties); >> } >> >> ATB, Mark. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) 2021-06-25 7:38 [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 1/2] g364fb: use RAM memory region for framebuffer Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState Mark Cave-Ayland @ 2021-06-25 16:37 ` Mark Cave-Ayland 2021-06-25 17:20 ` Philippe Mathieu-Daudé 2 siblings, 1 reply; 9+ messages in thread From: Mark Cave-Ayland @ 2021-06-25 16:37 UTC (permalink / raw) To: qemu-devel, f4bug, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 25/06/2021 08:38, Mark Cave-Ayland wrote: > I noticed whilst testing the previous dp8393x patchset that I would always > get a segfault whilst attempting to migrate the MIPS magnum machine. > > A bit of detective work shows that the problem is an incorrect VMStateDescription > in the g364fb device which expects a G364State but instead receives a > G364SysBusState. > > Looking back through the git history suggests that migration for this device > (and also the MIPS magnum machines) has been broken for several years, so patch > 1 takes the opportunity to improve the migration stream for the framebuffer > first whilst patch 2 contains the actual fix. > > Note that I don't use the MIPS magnum machines on a regular basis but the > patchset fixes the migration error and survives some light testing here. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > > > Mark Cave-Ayland (2): > g364fb: use RAM memory region for framebuffer > g364fb: add VMStateDescription for G364SysBusState > > hw/display/g364fb.c | 27 ++++++++++++++++++--------- > 1 file changed, 18 insertions(+), 9 deletions(-) Thanks for the review Phil, I've just sent v2 on its way. Does it make sense for this to be merged via the MIPS tree? ATB, Mark. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) 2021-06-25 16:37 ` [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland @ 2021-06-25 17:20 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2021-06-25 17:20 UTC (permalink / raw) To: Mark Cave-Ayland, qemu-devel, aurelien, jiaxun.yang, aleksandar.rikalo, hpoussin, fthain On 6/25/21 6:37 PM, Mark Cave-Ayland wrote: > On 25/06/2021 08:38, Mark Cave-Ayland wrote: > >> I noticed whilst testing the previous dp8393x patchset that I would >> always >> get a segfault whilst attempting to migrate the MIPS magnum machine. >> >> A bit of detective work shows that the problem is an incorrect >> VMStateDescription >> in the g364fb device which expects a G364State but instead receives a >> G364SysBusState. >> >> Looking back through the git history suggests that migration for this >> device >> (and also the MIPS magnum machines) has been broken for several years, >> so patch >> 1 takes the opportunity to improve the migration stream for the >> framebuffer >> first whilst patch 2 contains the actual fix. >> >> Note that I don't use the MIPS magnum machines on a regular basis but the >> patchset fixes the migration error and survives some light testing here. >> >> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> >> >> Mark Cave-Ayland (2): >> g364fb: use RAM memory region for framebuffer >> g364fb: add VMStateDescription for G364SysBusState >> >> hw/display/g364fb.c | 27 ++++++++++++++++++--------- >> 1 file changed, 18 insertions(+), 9 deletions(-) > > Thanks for the review Phil, I've just sent v2 on its way. Does it make > sense for this to be merged via the MIPS tree? Sure, I was going to suggest that too. Gerd could still beats me since it is hw/display/ ;) I plan to send another pull request during next week. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2021-06-25 17:21 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-06-25 7:38 [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 1/2] g364fb: use RAM memory region for framebuffer Mark Cave-Ayland 2021-06-25 8:37 ` Philippe Mathieu-Daudé 2021-06-25 11:52 ` Mark Cave-Ayland 2021-06-25 7:38 ` [PATCH 2/2] g364fb: add VMStateDescription for G364SysBusState Mark Cave-Ayland 2021-06-25 8:44 ` Philippe Mathieu-Daudé 2021-06-25 11:57 ` Mark Cave-Ayland 2021-06-25 16:37 ` [PATCH 0/2] g364fb: fix migration (or: fix migration for MIPS magnum machines) Mark Cave-Ayland 2021-06-25 17:20 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).