On Fri, 2010-06-25 at 13:02 -0400, Jes Sorensen wrote:
> On 06/25/10 18:41, Frank Arnold wrote:
> > On Thu, 2010-06-10 at 05:42 -0400, jes.soren...@redhat.com wrote:
> >> diff --git a/os-posix.c b/os-posix.c
> >> index 6417d16..1672e06 100644
> >> --- a/os-posix.c
> >> +++ b/os-posix.c
> >> @@ -160
On Thu, 2010-06-10 at 05:42 -0400, jes.soren...@redhat.com wrote:
> diff --git a/os-posix.c b/os-posix.c
> index 6417d16..1672e06 100644
> --- a/os-posix.c
> +++ b/os-posix.c
> @@ -160,6 +162,9 @@ void os_parse_cmd_args(int index, const char *optarg)
> case QEMU_OPTION_chroot:
> chroo
Allows us to compress the protocol a bit by setting a flag on the
offset which indicates we're still working within the same block
as last time. That way we can avoid sending the block name for
every page. Suggested by Anthony Liguori.
Signed-off-by: Alex Williamson
---
arch_init.c | 94 +++
On 06/25/10 12:32, Gianni Tedesco wrote:
> A device MAY provide extended descriptors in 2 ways mentioned in the
> spec, but ISTR finding at least one device in the wild with standard
> descriptors extended which were not so much used by the "host" but by
> application software. So not sure about y
Now that we can support a ram_addr_t space with holes, we can implement
qemu_ram_free().
Signed-off-by: Alex Williamson
---
cpu-all.h |3 +++
exec.c| 59 +++
2 files changed, 54 insertions(+), 8 deletions(-)
diff --git a/cpu-all
We automatically delete blockdev host parts on unplug of the guest
device. Too much magic, but we can't change that now.
The delete happens early in the guest device teardown, before the
connection to the host part is severed. Thus, the guest part's
pointer to the host part dangles for a brief t
On Fri, 2010-06-25 at 19:34 +0200, Frank Arnold wrote:
> On Fri, 2010-06-25 at 13:02 -0400, Jes Sorensen wrote:
> > On 06/25/10 18:41, Frank Arnold wrote:
> > > On Thu, 2010-06-10 at 05:42 -0400, jes.soren...@redhat.com wrote:
> > >> diff --git a/os-posix.c b/os-posix.c
> > >> index 6417d16..1672e0
We don't want to assume a contiguous address space, so migrate based
on RAM blocks instead of a fixed linear address map. This will allow
us to have holes in the ram_addr_t namespace, so we can implement
qemu_ram_free().
Signed-off-by: Alex Williamson
---
arch_init.c | 67 +++
Hello,
I propose this small patch so that ARM semi-hosting handles stderr as
expected when linking with Newlib/libgloss.
diff --git a/arm-semi.c b/arm-semi.c
index 9549e6c..6874036 100644
--- a/arm-semi.c
+++ b/arm-semi.c
@@ -211,8 +211,11 @@ uint32_t do_arm_semihosting(CPUState *env)
BlockDriverState member removable controls whether virtual media
change (monitor commands change, eject) is allowed. It is set when
the "type hint" is BDRV_TYPE_CDROM or BDRV_TYPE_FLOPPY.
The type hint is only set by drive_init(). It sets BDRV_TYPE_FLOPPY
for if=floppy. It sets BDRV_TYPE_CDROM
For callers that pass a device we can traverse up the qdev tree and
make use of the BusInfo.get_dev_path information for creating unique
savevm id strings. This avoids needing to rely on the instance number,
which can cause problems with device initialization order and hotplug.
For compatibility,
Signed-off-by: Markus Armbruster
---
hw/ide.h | 11 ++-
hw/ide/isa.c |8
hw/ide/piix.c |6 --
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/hw/ide.h b/hw/ide.h
index 0e7d540..f0cb320 100644
--- a/hw/ide.h
+++ b/hw/ide.h
@@ -1,17 +1,18 @@
#
Synchronize RAM blocks with the target and migrate using name/offset
pairs. This ensures both source and target have the same view of
RAM and that we get the right bits into the right slot.
Signed-off-by: Alex Williamson
---
arch_init.c | 118 ++
Now that we have a working qemu_ram_free() and the primary runtime
user of it has been updated, don't be lenient about duplicate id strings.
We also shouldn't need to create them ondemand at the target.
Signed-off-by: Alex Williamson
---
arch_init.c |5 +++--
exec.c | 13 +++-
Signed-off-by: Jan Kiszka
---
cpus.c |1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/cpus.c b/cpus.c
index fcd0f09..37e6b33 100644
--- a/cpus.c
+++ b/cpus.c
@@ -331,6 +331,7 @@ int qemu_init_main_loop(void)
return ret;
qemu_cond_init(&qemu_pause_cond);
+
Stuff a pointer to the DeviceState into the VirtIONet structure so that
we can easily remove the vmstate entry later. Also, let vmstate track
the instance number (it should always be zero internally since the
device path should now be unique).
Signed-off-by: Alex Williamson
---
hw/virtio-net.c
Make the property point to BlockDriverState, cutting out the DriveInfo
middleman. This prepares the ground for block devices that don't have
a DriveInfo.
Currently all user-defined ones have a DriveInfo, because the only way
to define one is -drive & friends (they go through drive_init()).
DriveI
With these two pieces in place, we can start naming ramblocks. When
the device is present and it lives on a bus that provides a device
path, we concatenate the path and the provided name. Otherwise we
just use name. The resulting id string must be unique. For now we
assume an allocation for the
Define barrier() as optimization barrier and replace (potentially
unreliable) asm("") fences.
Signed-off-by: Jan Kiszka
---
cpu-exec.c |5 +++--
qemu-barrier.h |3 +++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/cpu-exec.c b/cpu-exec.c
index 026980a..525b3b4 100644
This will benefit us when we migrate based on ramblock name since
we won't be bouncing between separate blocks.
Signed-off-by: Alex Williamson
---
hw/pc.c | 22 +-
1 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 1848151..d6f3aa4 1006
Drives defined with -drive if=ide get get created along with the IDE
controller, inside machine->init(). That's before cmos_init().
Drives defined with -device get created during generic device init.
That's after cmos_init(). Because of that, CMOS has no information on
them (type, geometry, trans
This allows us to create a more meaningful savevm string.
Signed-off-by: Alex Williamson
---
hw/eepro100.c |4 ++--
hw/eeprom93xx.c |8
hw/eeprom93xx.h |4 ++--
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/hw/eepro100.c b/hw/eepro100.c
index 0ddca8b..2b7
If a cpu_exit request is pending, ensure that we leave the CPU loop
quickly. For this purpose, keep the global exit_request pending until
we are about to leave tcg_cpu_exec. Also, immediately break out of the
SMP loop if the request is set, do not run till the end of the chain.
This preserves the V
Unused since commit 6ced55a5.
Signed-off-by: Markus Armbruster
---
blockdev.c | 12
blockdev.h |1 -
2 files changed, 0 insertions(+), 13 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 3b8c606..e0495e5 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -78,18 +78,6 @@ int d
Signed-off-by: Alex Williamson
---
hw/pci.c | 11 +++
1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index fe7c5c3..a7ff566 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -76,6 +76,7 @@ static struct BusInfo pci_bus_info = {
static void pci_update_mapping
These will be used to generate unique id strings for ramblocks. The name
field is required, the device pointer is optional as most callers don't
have a device. When there's no device or the device isn't a child of
a bus implementing BusInfo.get_dev_path, the name should be unique for
the platform
v2:
Not too many comments, hope that's because everyone agrees ;)
A couple minor changes. The 2nd patch is new and provides a
bit of an optimization for large memory pc guets. The first
two patches stand on their own even if we're undecided about
the rest. Thanks,
Alex
changes:
- Use pci_fi
Signed-off-by: Markus Armbruster
---
blockdev.c | 12
blockdev.h |1 -
2 files changed, 0 insertions(+), 13 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 827ea1c..3747098 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -75,18 +75,6 @@ DriveInfo *drive_get(BlockInterface
This patch adds a case handling path_id invoked on a virtio-blk device.
Currently path_id walks the parent path to virtio-pci but doesn't know
that it's the end of the path and exits without building the path (providing no
output resulting in no disk/by-path symlinks to virtio-blk devices).
This pa
This function is meant to provide a stable device path for buses
which are able to implement it. If a bus has a globally unique
addresses scheme, one address level may be sufficient to provide
a path. Other buses may need to recursively traverse up the
qdev tree.
Signed-off-by: Alex Williamson
This works great for PCI since a ::. uniquely
describes a global address. No need to traverse up the qdev tree.
PCI segment support is a placeholder for compatibility once we
support multiple segments.
Signed-off-by: Alex Williamson
---
hw/pci.c | 14 ++
1 files changed, 14 inser
On 06/17/2010 12:40 PM, Aurelien Jarno wrote:
>> +/* Handle the modifiers. */
>> +if (ct & TCG_CT_CONST_NEG) {
>> +val = -val;
>> +}
>
> This "modifier" is only used by subi. Wouldn't it be better to use a
> TCG_CT_CONST_SUBI instead?
Not really. This negation needs to happe
On 06/25/10 18:41, Frank Arnold wrote:
> On Thu, 2010-06-10 at 05:42 -0400, jes.soren...@redhat.com wrote:
>> diff --git a/os-posix.c b/os-posix.c
>> index 6417d16..1672e06 100644
>> --- a/os-posix.c
>> +++ b/os-posix.c
>> @@ -160,6 +162,9 @@ void os_parse_cmd_args(int index, const char *optarg)
>>
On 06/22/2010 06:32 PM, Anthony Liguori wrote:
Hrm, the way you've sent this patch makes Thunderbird unhappy. It
appears the whole thing is treated as an attachment. In the future, I'd
suggest avoiding the Content-Disposition tag
Sure. I will take care of this in future.
On 06/21/2010 11:01
None of its callers checks for failure. scsi_hot_add() can crash
because of that:
(qemu) drive_add 4 if=scsi,format=host_device,file=/dev/sg1
scsi-generic: scsi generic interface too old
Segmentation fault (core dumped)
Fix all callers, not just scsi_hot_add().
Signed-off-by: Markus Armbruster
savevm.c keeps a pointer to the snapshot block device. If you manage
to get that device deleted, the pointer dangles, and the next snapshot
operation will crash & burn. Unplugging a guest device that uses it
does the trick:
$ MALLOC_PERTURB_=234 qemu-system-x86_64 [...]
QEMU 0.12.50 moni
For instance, -device scsi-disk,drive=foo -device scsi-disk,drive=foo
happily creates two SCSI disks connected to the same block device.
It's all downhill from there.
Device usb-storage deliberately attaches twice to the same blockdev,
which fails with the fix in place. Detach before the second a
These functions are also used for kvm under !CONFIG_IOTHREAD, having
'tcg' in their name is just misleading.
Signed-off-by: Jan Kiszka
---
cpus.c | 10 +-
cpus.h |2 +-
vl.c |2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/cpus.c b/cpus.c
index 2ce839d..c
On Thu, Jun 24, 2010 at 05:43:15PM -0600, Cam Macdonell wrote:
> Hi Michael,
>
> I'm trying to write a uio driver for my shared memory device for KVM
> and I'm running into a situation where several interrupts in quick
> succession are not all triggering the callback function in my kernel
> UIO dr
All callers of ide_create_drive() ignore its value. Currently
harmless, because it fails only when qdev_init() fails, which fails
only when ide_drive_initfn() fails, which never fails.
Brittle. Change it to die instead of silently ignoring failure.
Signed-off-by: Markus Armbruster
---
hw/ide/
Guest debugging is currently broken under CONFIG_IOTHREAD. The reason is
inconsistent or even lacking signaling the debug events from the source
VCPU to the main loop and the gdbstub.
This patch addresses the issue by pushing this signaling into a
CPUDebugExcpHandler: cpu_debug_handler is register
This patch unpoisons CPUState and env in once-compiled files.
To achieve this, it defines an opaque struct CPUState in cpu-common.h.
This also requires tweaking the relationship between CPUState and
CPUXYZState in target files.
Unpoisoning env is needed because it is widely used as the name for
CP
I'm working on cleanly separating block device host and guest parts.
I'd like to route all this work through Kevin's block tree. This is
still just preliminaries.
There will be at least one more round of cleanup & fixes before
blockdev_add proper. I intend to start with a minimal QMP-only
versio
Signed-off-by: Markus Armbruster
---
blockdev.c | 12
blockdev.h |1 +
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index e0495e5..8023cfd 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -78,6 +78,18 @@ int drive_get_max_bus(BlockInterfac
prevents those ifdefs from creeping in again.
Cc: Isaku Yamahata
Signed-off-by: Paolo Bonzini
---
cpu-common.h |4
qemu-common.h |5 +
2 files changed, 1 insertions(+), 8 deletions(-)
diff --git a/cpu-common.h b/cpu-common.h
index d905258..639c58d 100644
--- a/cpu-common.h
++
This patch series provides updates to udev to allow the creation symlinks for
virtio-blk devices, specifically disk/by-id and disk/by-path. This is most
useful for virtio-blk devices that do not yet have any filesystem for which a
UUID can be extracted (disk/by-uuid). These patches (save the path
Signed-off-by: Paolo Bonzini
---
cpus.c | 16
cpus.h |2 ++
hw/qdev-properties.c | 44
hw/qdev.h|5 +
4 files changed, 67 insertions(+), 0 deletions(-)
diff --git a/cpus.c b/cpus
On Thu, 2010-06-24 at 05:45 +0100, TJ wrote:
> Here is small patch that fixed my problem.
>
> In looking at the USB spec, it seems pretty clear cut about the whole
> device/config/interface/endpoint descriptor hierarchy, so the
> usb_host_claim_interfaces can be optimized instead of parsing throug
On 06/07/2010 04:03 AM, hadi motamedi wrote:
> Dear All
> Can you please let me know if the qemu emulating PowerPC (I mean
> qemu-system-ppc.exe) can accept VxWork kernet for boot up?
> Thank you
>
As is, the QEMU PowerPC platform will definitely not boot a VxWorks image.
It is possible to boot a
Because we all love type safety, don't we?
Signed-off-by: Paolo Bonzini
---
cpu-common.h |1 -
cpus.c| 23 ---
hw/apic.c |4 ++--
hw/pc.c |4 ++--
qemu-common.h |7 ---
5 files changed, 16 insertions(+), 23 deletions(-)
diff --git a/c
Signed-off-by: Paolo Bonzini
---
disas.h |5 +
dyngen-exec.h | 16
qemu-common.h |7 ---
3 files changed, 1 insertions(+), 27 deletions(-)
diff --git a/disas.h b/disas.h
index 6a9332d..1af0511 100644
--- a/disas.h
+++ b/disas.h
@@ -2,17 +2,14 @@
#define
We currently need this either to allocate the next ram_addr_t for a
new block, or for total memory to be migrated. Both of which we can
calculate without need of this to keep us in a contiguous address space.
Signed-off-by: Alex Williamson
---
arch_init.c | 23 ---
cpu-al
All of these files were already including qemu-common.h indirectly,
e.g. via cpu-all.h, just not early enough.
Signed-off-by: Paolo Bonzini
---
arm-semi.c|2 +-
bsd-user/qemu.h |1 +
cpu-exec.c|1 +
darwin-user/qemu.h|
I can reproduce with qemu-kvm 0.12.4 like the original reporter. I
cannot reproduce with qemu-kvm upstream, qemu stable, or qemu upstream.
So boot=on could be the culprit. Libvirt generated command line:
LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin
/qemu-system-x86_64 -
Thanks, Mark.
-Original Message-
From: Markus Armbruster [mailto:arm...@redhat.com]
Sent: 2010年6月25日 12:58
To: Hao, Xudong
Cc: qemu-devel@nongnu.org; aligu...@us.ibm.com; k...@vger.kernel.org
Subject: Re: qemu fail to parse command line with "-pcidevice 00:19.0"
"Hao, Xudong" writes:
Signed-off-by: Jan Kiszka
---
cpus.c |5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/cpus.c b/cpus.c
index aef92cd..2ce839d 100644
--- a/cpus.c
+++ b/cpus.c
@@ -39,7 +39,6 @@
#define SIG_IPI SIGUSR1
#endif
-static CPUState *cur_cpu;
static CPUState *next_cpu;
This series unbreaks -smp >1 and guest debugging in CONFIG_IOTHREAD
mode. I still find the SMP scheduling in cpu_exec_all suboptimal, but
at least it works now.
Dependencies are:
http://thread.gmane.org/gmane.comp.emulators.kvm.devel/52718 (kvm queue)
http://thread.gmane.org/gmane.comp.emulators.q
Hidetoshi Seto writes:
> (2010/06/24 15:08), Markus Armbruster wrote:
>> Note to qemu-devel: this issue is qemu-kvm only.
>>
>> "Hao, Xudong" writes:
>>
>>> When assign one PCI device, qemu fail to parse the command line:
>>> qemu-system_x86 -smp 2 -m 1024 -hda /path/to/img -pcidevice host=00:
On Thu, Jun 24, 2010 at 01:16:03AM +0100, Jamie Lokier wrote:
> Serge Hallyn wrote:
> > The default of qemu-img (of using O_SYNC) is not very sensible
> > because anyway, the client (the kernel) uses caches (write-back),
> > (and "qemu-nbd -d" doesn't flush those by the way). So if for
> > instance
If a signal hit after the env->exit_request check but before cpu_exec
updated env->current_tb, cpu_unlink_tb called from the signal hander
will not unlink the current TB. This may leave us stuck in a guest loop
if no further unlink is invoked.
Fix this by reordering current_tb update and exit_requ
Using virtio-blk serial attributes add rules to extract drive serial numbers and
generate by-id links for the block device and partitions.
With these rules added, we now see the following symlinks in disk/by-id
% ls -al /dev/disk/by-id | grep vdb
lrwxrwxrwx. 1 root root 9 Jun 1 22:09 virtio-QM
On Fri, Jun 25, 2010 at 06:53:23PM +0200, Markus Armbruster wrote:
> Unused since commit 6ced55a5.
>
> Signed-off-by: Markus Armbruster
Looks good,
Reviewed-by: Christoph Hellwig
From: Amit Shah
qemu-config.c doesn't contain any target-specific code, and the
TARGET_I386 conditional code didn't get compiled as a result. Removing
this enables the driftfix parameter for rtc.
Signed-off-by: Amit Shah
Signed-off-by: Paolo Bonzini
---
qemu-config.c |2 --
1 files change
This is a different way to achieve the same objective as Isamu's patch.
Basically, his patch becomes the (much simpler) patch 7 of this series,
and everything else is something I had had lying around for a while. :)
Patch 1 is simply Amit's patch, included here for convenience as it's
not been app
(2010/06/24 15:08), Markus Armbruster wrote:
> Note to qemu-devel: this issue is qemu-kvm only.
>
> "Hao, Xudong" writes:
>
>> When assign one PCI device, qemu fail to parse the command line:
>> qemu-system_x86 -smp 2 -m 1024 -hda /path/to/img -pcidevice host=00:19.0
>> Error:
>> qemu-system-x86
On Fri, Jun 25, 2010 at 06:53:22PM +0200, Markus Armbruster wrote:
> All callers of ide_create_drive() ignore its value. Currently
> harmless, because it fails only when qdev_init() fails, which fails
> only when ide_drive_initfn() fails, which never fails.
>
> Brittle. Change it to die instead
On Fri, Jun 25, 2010 at 12:47:03PM +0530, Amit Shah wrote:
> On (Thu) Jun 24 2010 [18:54:07], Michael S. Tsirkin wrote:
> > We were requesting too much when checking buffer
> > length: size already includes host header length.
> >
> > Further, we should not exit if we get a packet that
> > is too
On 06/14/2010 07:11 PM, Paolo Bonzini wrote:
lsi_bad_phase has a bug in the choice of pmjad1/pmjad2. This does
not matter with Linux guests because it uses just one routine for
both, but it breaks Windows 64-bit guests. This is the text
from the spec:
"[The PMJCTL] bit controls which decis
On (Thu) Jun 24 2010 [18:54:07], Michael S. Tsirkin wrote:
> We were requesting too much when checking buffer
> length: size already includes host header length.
>
> Further, we should not exit if we get a packet that
> is too long, since this might not be under control
> of the guest. Just drop t
On 06/25/2010 05:02 AM, Isaku Yamahata wrote:
poison TARGET_xxx for compile once object
to prevent those ifdef from creeping in again.
didn't poison env which is used as function argument as void *env.
Although it would be possible to sort it out, for now just not poison it.
qemu-malloc.c didn'
On Fri, Jun 25, 2010 at 06:53:21PM +0200, Markus Armbruster wrote:
> None of its callers checks for failure. scsi_hot_add() can crash
> because of that:
>
> (qemu) drive_add 4 if=scsi,format=host_device,file=/dev/sg1
> scsi-generic: scsi generic interface too old
> Segmentation fault (core dumped
Hi,
we are a company which makes a toolset for hardware/software co-design and
parallel programming
http://www.proximusda.com
We would like to try to link Qemu with our solution in order to support virtual
prototyping.
For that we are looking for (potentially paid) support by the Qemu develope
When checking for I/O events in the tcg CPU loop, make sure that we
call qemu_wait_io_event_common for all CPUs, not only the current one.
Otherwise pause_all_vcpus may lock up or run_on_cpu requests may starve.
Rename qemu_wait_io_event to qemu_tcg_wait_io_event at this chance and
purge its argum
> +DriveInfo *drive_of_blockdev(BlockDriverState *bs)
I'd call this find_drive_by_blockdev.
On 06/25/2010 05:52 AM, Paolo Bonzini wrote:
> This is a different way to achieve the same objective as Isamu's patch.
> Basically, his patch becomes the (much simpler) patch 7 of this series,
> and everything else is something I had had lying around for a while. :)
>
> Patch 1 is simply Amit's pa
Cole Robinson writes:
> I can reproduce with qemu-kvm 0.12.4 like the original reporter. I
> cannot reproduce with qemu-kvm upstream, qemu stable, or qemu upstream.
> So boot=on could be the culprit. Libvirt generated command line:
>
> LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=no
Christoph Hellwig writes:
>> +DriveInfo *drive_of_blockdev(BlockDriverState *bs)
>
> I'd call this find_drive_by_blockdev.
For what it's worth, all externally visible functions dealing with
drives start with "drive_".
Did this fall through the cracks?
Markus Armbruster writes:
> For all i, ports_map[i] is used in and only in the i-th iteration.
> Replace the dynamic array by a scalar variable.
>
> Signed-off-by: Markus Armbruster
> ---
> hw/virtio-serial-bus.c | 12 +++-
> 1 files changed, 3 inser
On Fri, 25 Jun 2010, Richard Henderson wrote:
> Original patch from Ulrich Hecht, further work from Alexander Graf
> and Richard Henderson.
>
> Cc: Ulrich Hecht
> Cc: Alexander Graf
> Signed-off-by: Richard Henderson
[..snip..]
> +/* #define DEBUG_S390_TCG */
> +
> +#ifdef DEBUG_S390_TCG
> +#
"Daniel P. Berrange" writes:
[...]
> The main problem encountered with this patch series is the
> split between argv and config parameters. The qemu-config.c
> file provides the information is a good data format, allowing
> programatic access to the list of parameters for each config
> option (eg
"Daniel P. Berrange" writes:
> There is quite alot of code using an enumeration of possible
> values, which also needs todo conversions to/from a string
> representation of enum values. These string <-> int conversions
> have been repeated in an adhoc manner throughout the code.
>
> This makes it
81 matches
Mail list logo