void console_print(struct consfront_dev *dev, char *data, int length) { char *curr_char, saved_char; char copied_str[length+1]; char *copied_ptr; int part_len; int (*ring_send_fn)(struct consfront_dev *dev, const char *data, unsigned length); if(!console_initialised) ring_send_fn = xencons_ring_send_no_notify; else ring_send_fn = xencons_ring_send; copied_ptr = copied_str; memcpy(copied_ptr, data, length); for(curr_char = copied_ptr; curr_char < copied_ptr+length-1; curr_char++) { if(*curr_char == '\n') { *curr_char = '\r'; saved_char = *(curr_char+1); *(curr_char+1) = '\n'; part_len = curr_char - copied_ptr + 2; #ifdef CONFIG_CONSFRONT_SYNC ring_send_sync(ring_send_fn, dev, copied_ptr, part_len); #else ring_send_fn(dev, copied_ptr, part_len); #endif *(curr_char+1) = saved_char; copied_ptr = curr_char+1; length -= part_len - 1; } } if (copied_ptr[length-1] == '\n') { copied_ptr[length-1] = '\r'; copied_ptr[length] = '\n'; length++; } #ifdef CONFIG_CONSFRONT_SYNC ring_send_sync(ring_send_fn, dev, copied_ptr, length); #else ring_send_fn(dev, copied_ptr, length); #endif }
void minios_console_print(struct consfront_dev *dev, char *data, int length) { char *curr_char, saved_char; char copied_str[length+1]; char *copied_ptr; int part_len; int (*ring_send_fn)(struct consfront_dev *dev, const char *data, unsigned length); int sent; if(!console_initialised) ring_send_fn = xencons_ring_send_no_notify; else ring_send_fn = xencons_ring_send; copied_ptr = copied_str; memcpy(copied_ptr, data, length); for(curr_char = copied_ptr; curr_char < copied_ptr+length-1; curr_char++) { if(*curr_char == '\n') { *curr_char = '\r'; saved_char = *(curr_char+1); *(curr_char+1) = '\n'; part_len = curr_char - copied_ptr + 2; ring_send_fn(dev, copied_ptr, part_len); *(curr_char+1) = saved_char; copied_ptr = curr_char+1; length -= part_len - 1; } } if (copied_ptr[length-1] == '\n') { copied_ptr[length-1] = '\r'; copied_ptr[length] = '\n'; length++; } /* * we assume that the lower layer loops until it manages to * send everything. XXX is this the best place to do "buffering"? */ sent = ring_send_fn(dev, copied_ptr, length); ASSERT(ring_send_fn == xencons_ring_send_no_notify || sent == length); }
static inline int ring_send_sync(int (*ring_send_fn)(struct consfront_dev *dev, const char *data, unsigned len), struct consfront_dev *dev, const char *data, unsigned len) { unsigned shift = 0; int ret = 0; /* busy loop until all data has been sent out */ while (len) { ret = ring_send_fn(dev, (data + shift), len); if (ret < 0) return -1; shift += ret; len -= ret; } return 0; }