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
This commit is contained in:
		
							parent
							
								
									b36d24b6c3
								
							
						
					
					
						commit
						2970a6c943
					
				
							
								
								
									
										20
									
								
								qemu-char.c
								
								
								
								
							
							
						
						
									
										20
									
								
								qemu-char.c
								
								
								
								
							| 
						 | 
				
			
			@ -101,6 +101,10 @@
 | 
			
		|||
/***********************************************************/
 | 
			
		||||
/* character device */
 | 
			
		||||
 | 
			
		||||
static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs =
 | 
			
		||||
    TAILQ_HEAD_INITIALIZER(chardevs);
 | 
			
		||||
static int initial_reset_issued;
 | 
			
		||||
 | 
			
		||||
static void qemu_chr_event(CharDriverState *s, int event)
 | 
			
		||||
{
 | 
			
		||||
    if (!s->chr_event)
 | 
			
		||||
| 
						 | 
				
			
			@ -118,12 +122,23 @@ static void qemu_chr_reset_bh(void *opaque)
 | 
			
		|||
 | 
			
		||||
void qemu_chr_reset(CharDriverState *s)
 | 
			
		||||
{
 | 
			
		||||
    if (s->bh == NULL) {
 | 
			
		||||
    if (s->bh == NULL && initial_reset_issued) {
 | 
			
		||||
	s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
 | 
			
		||||
	qemu_bh_schedule(s->bh);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_chr_initial_reset(void)
 | 
			
		||||
{
 | 
			
		||||
    CharDriverState *chr;
 | 
			
		||||
 | 
			
		||||
    initial_reset_issued = 1;
 | 
			
		||||
 | 
			
		||||
    TAILQ_FOREACH(chr, &chardevs, next) {
 | 
			
		||||
        qemu_chr_reset(chr);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
 | 
			
		||||
{
 | 
			
		||||
    return s->chr_write(s, buf, len);
 | 
			
		||||
| 
						 | 
				
			
			@ -2076,9 +2091,6 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str,
 | 
			
		|||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs
 | 
			
		||||
= TAILQ_HEAD_INITIALIZER(chardevs);
 | 
			
		||||
 | 
			
		||||
CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s))
 | 
			
		||||
{
 | 
			
		||||
    const char *p;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,6 +74,7 @@ void qemu_chr_add_handlers(CharDriverState *s,
 | 
			
		|||
                           void *opaque);
 | 
			
		||||
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg);
 | 
			
		||||
void qemu_chr_reset(CharDriverState *s);
 | 
			
		||||
void qemu_chr_initial_reset(void);
 | 
			
		||||
int qemu_chr_can_read(CharDriverState *s);
 | 
			
		||||
void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len);
 | 
			
		||||
void qemu_chr_accept_input(CharDriverState *s);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue