Commit 2970a6c9435a4857ead2120313d1b1ba4be06d5d
1 parent
b36d24b6
char: Fix initial reset (Jan Kiszka)
Recent changes to the graphical console initialization broke the initial CHR_EVENT_RESET distribution. The reset BHs generated on char device initialization are now already consumed during machine init (ide init ... -> qemu_aio_wait -> qemu_bh_poll). Therefore, this patch moves the initial qemu_chr_reset calls into a separate funtion which is called after machine init. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6700 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
18 additions
and
4 deletions
qemu-char.c
| ... | ... | @@ -101,6 +101,10 @@ |
| 101 | 101 | /***********************************************************/ |
| 102 | 102 | /* character device */ |
| 103 | 103 | |
| 104 | +static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs = | |
| 105 | + TAILQ_HEAD_INITIALIZER(chardevs); | |
| 106 | +static int initial_reset_issued; | |
| 107 | + | |
| 104 | 108 | static void qemu_chr_event(CharDriverState *s, int event) |
| 105 | 109 | { |
| 106 | 110 | if (!s->chr_event) |
| ... | ... | @@ -118,12 +122,23 @@ static void qemu_chr_reset_bh(void *opaque) |
| 118 | 122 | |
| 119 | 123 | void qemu_chr_reset(CharDriverState *s) |
| 120 | 124 | { |
| 121 | - if (s->bh == NULL) { | |
| 125 | + if (s->bh == NULL && initial_reset_issued) { | |
| 122 | 126 | s->bh = qemu_bh_new(qemu_chr_reset_bh, s); |
| 123 | 127 | qemu_bh_schedule(s->bh); |
| 124 | 128 | } |
| 125 | 129 | } |
| 126 | 130 | |
| 131 | +void qemu_chr_initial_reset(void) | |
| 132 | +{ | |
| 133 | + CharDriverState *chr; | |
| 134 | + | |
| 135 | + initial_reset_issued = 1; | |
| 136 | + | |
| 137 | + TAILQ_FOREACH(chr, &chardevs, next) { | |
| 138 | + qemu_chr_reset(chr); | |
| 139 | + } | |
| 140 | +} | |
| 141 | + | |
| 127 | 142 | int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len) |
| 128 | 143 | { |
| 129 | 144 | return s->chr_write(s, buf, len); |
| ... | ... | @@ -2076,9 +2091,6 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
| 2076 | 2091 | return NULL; |
| 2077 | 2092 | } |
| 2078 | 2093 | |
| 2079 | -static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs | |
| 2080 | -= TAILQ_HEAD_INITIALIZER(chardevs); | |
| 2081 | - | |
| 2082 | 2094 | CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s)) |
| 2083 | 2095 | { |
| 2084 | 2096 | const char *p; | ... | ... |
qemu-char.h
| ... | ... | @@ -74,6 +74,7 @@ void qemu_chr_add_handlers(CharDriverState *s, |
| 74 | 74 | void *opaque); |
| 75 | 75 | int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg); |
| 76 | 76 | void qemu_chr_reset(CharDriverState *s); |
| 77 | +void qemu_chr_initial_reset(void); | |
| 77 | 78 | int qemu_chr_can_read(CharDriverState *s); |
| 78 | 79 | void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len); |
| 79 | 80 | void qemu_chr_accept_input(CharDriverState *s); | ... | ... |
vl.c