From: Paolo Bonzini <pbonzini@redhat.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: Sasha Levin <levinsasha928@gmail.com>,
penberg@kernel.org, john@jfloren.net, kvm@vger.kernel.org,
asias.hejun@gmail.com, gorcunov@gmail.com,
prasadjoshi124@gmail.com
Subject: Re: [PATCH 5/5 V2] kvm tools: Initialize and use VESA and VNC
Date: Wed, 25 May 2011 10:21:28 +0200 [thread overview]
Message-ID: <4DDCBC08.3030507@redhat.com> (raw)
In-Reply-To: <20110524194019.GA27634@elte.hu>
On 05/24/2011 09:40 PM, Ingo Molnar wrote:
> > Ah, forgot about this. Given_why_ this happens (for static libraries, the
> > linker omits object modules that are not required to fulfill undefined
> > references in previous objects), I'd be surprised if explicit section tricks
> > do not have the same limitation. [...]
>
> Since we create an actual array (data)
Are you? I figured it was like this example from Linux:
.x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {
__x86_cpu_dev_start = .;
*(.x86_cpu_dev.init)
__x86_cpu_dev_end = .;
}
extern const struct cpu_dev *const __x86_cpu_dev_start[],
*const __x86_cpu_dev_end[];
for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
This is pretty much the same as the linker script for ELF:
.init_array : {
__init_array_start = .;
*(.init_array)
*(SORT(.init_array$*))
__init_array_end = .;
}
extern void (*__init_array_start []) (int, char **, char **)
attribute_hidden;
extern void (*__init_array_end []) (int, char **, char **)
attribute_hidden;
const size_t size = __init_array_end - __init_array_start;
for (size_t i = 0; i < size; i++)
(*__init_array_start [i]) (argc, argv, envp);
> ((constructor)) has showstopper properties:
>
> - We don't have access to the program arguments
>
> - stdio is probably not set up yet (this is undefined AFAICS)
As I said, you can do this even better by doing only minimal work in the
constructor. Create a struct with several callbacks (pre_init,
late_init, destroy, reset, whatever) and possibly other information (a
human-readable device name and command-line argument to access it, for
example). In the constructor you just build a linked list of said
structs, and then you can walk it whenever you see fit: do comparisons,
call a function, whatever. This is similar to the cpudev example from
the kernel above.
A simple example from QEMU:
static void virtio_pci_register_devices(void)
{
pci_qdev_register_many(virtio_info);
}
/* This macro wraps ((constructor)). */
device_init(virtio_pci_register_devices)
> In that sense ((section)) is way more robust: there's not really that many
> ways to screw that up. Fiddling with the ((constructor)) environment on the
> other hand ...
Sorry, this is textbook FUD.
> __attribute__((constructor)) is not particularly portable to begin with: does
> the MSVC compiler support it for example?
No, but GCC supports it on non-ELF platforms, where you would need a
similar but different linker script. (Also, the differences between
MSVC and GCC can easily be abstracted with a macro).
More practically, is your linker script supported by gold?
Paolo
next prev parent reply other threads:[~2011-05-25 8:21 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-23 11:19 [PATCH 1/5 V2] kvm tools: Add BIOS INT10 handler Sasha Levin
2011-05-23 11:19 ` [PATCH 2/5 V2] kvm tools: Add video mode to kernel initialization Sasha Levin
2011-05-23 11:30 ` Ingo Molnar
2011-05-23 11:19 ` [PATCH 3/5 V2] kvm tools: Add VESA device Sasha Levin
2011-05-23 11:32 ` Ingo Molnar
2011-05-23 11:19 ` [PATCH 4/5 V2] kvm tools: Update makefile and feature tests Sasha Levin
2011-05-23 11:19 ` [PATCH 5/5 V2] kvm tools: Initialize and use VESA and VNC Sasha Levin
2011-05-23 11:38 ` Ingo Molnar
2011-05-23 11:45 ` Pekka Enberg
2011-05-24 8:37 ` Paolo Bonzini
2011-05-24 8:50 ` Ingo Molnar
2011-05-24 9:10 ` Paolo Bonzini
2011-05-24 9:55 ` Pekka Enberg
2011-05-24 11:22 ` Avi Kivity
2011-05-24 11:26 ` Pekka Enberg
2011-05-24 11:30 ` Sasha Levin
2011-05-24 11:30 ` Avi Kivity
2011-05-24 11:38 ` Pekka Enberg
2011-05-24 11:41 ` Avi Kivity
2011-05-24 11:56 ` Pekka Enberg
2011-05-24 12:27 ` Paolo Bonzini
2011-05-24 14:38 ` Avi Kivity
2011-05-24 14:37 ` Avi Kivity
2011-05-24 14:54 ` Pekka Enberg
2011-05-24 19:03 ` Ingo Molnar
2011-05-24 19:00 ` Ingo Molnar
2011-05-24 19:16 ` Ingo Molnar
2011-05-24 9:18 ` Paolo Bonzini
2011-05-24 19:40 ` Ingo Molnar
2011-05-25 8:21 ` Paolo Bonzini [this message]
2011-05-25 8:32 ` Ingo Molnar
2011-05-25 9:15 ` Paolo Bonzini
2011-05-25 9:36 ` Ingo Molnar
2011-05-25 10:01 ` Paolo Bonzini
2011-05-25 10:17 ` Ingo Molnar
2011-05-25 10:44 ` Paolo Bonzini
2011-05-25 12:53 ` Ingo Molnar
2011-05-25 15:37 ` Paolo Bonzini
2011-05-25 9:49 ` Ingo Molnar
2011-05-25 8:38 ` Ingo Molnar
2011-05-24 8:51 ` Cyrill Gorcunov
2011-05-23 14:10 ` Pekka Enberg
2011-05-23 11:29 ` [PATCH 1/5 V2] kvm tools: Add BIOS INT10 handler Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DDCBC08.3030507@redhat.com \
--to=pbonzini@redhat.com \
--cc=asias.hejun@gmail.com \
--cc=gorcunov@gmail.com \
--cc=john@jfloren.net \
--cc=kvm@vger.kernel.org \
--cc=levinsasha928@gmail.com \
--cc=mingo@elte.hu \
--cc=penberg@kernel.org \
--cc=prasadjoshi124@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox