Пример #1
0
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
}
Пример #2
0
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);
}
Пример #3
0
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;
}