Exemple #1
0
static void
dma_sparse_view_set_scroll_adjustments (GtkTextView *text_view,
                                      GtkAdjustment *hadj,
                                      GtkAdjustment *vadj)
{
	DmaSparseView *view = DMA_SPARSE_VIEW (text_view);

	if (vadj)
		g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
	
	if (view->priv->vadjustment && (view->priv->vadjustment != vadj))
    {
		g_signal_handlers_disconnect_by_func (view->priv->vadjustment,
									dma_sparse_view_value_changed,
					    			view);
     	g_object_unref (view->priv->vadjustment);
	}
	
	if (view->priv->vadjustment != vadj)
	{
		
		GTK_TEXT_VIEW_CLASS (parent_class)->set_scroll_adjustments  (GTK_TEXT_VIEW (view), hadj, NULL);
		
		if (vadj != NULL)
		{
			g_object_ref_sink (vadj);
      
			g_signal_connect (vadj, "value_changed",
                        G_CALLBACK (dma_sparse_view_value_changed),
						view);
			
			gtk_adjustment_set_upper (vadj, dma_sparse_buffer_get_upper (view->priv->buffer));
			gtk_adjustment_set_lower (vadj, dma_sparse_buffer_get_lower (view->priv->buffer));
			gtk_adjustment_set_value (vadj, 0);
		}
		view->priv->vadjustment = vadj;
		dma_sparse_view_update_adjustement (view);
	}
}
Exemple #2
0
static void
dma_disassembly_buffer_insert_line (DmaSparseIter *iter, GtkTextIter *dst)
{
	DmaDisassemblyBuffer * dis = (DmaDisassemblyBuffer *)iter->buffer;
	GtkTextBuffer *buffer = gtk_text_iter_get_buffer (dst);

	if (dis->debugger != NULL)
	{	
		dma_sparse_iter_refresh (iter);
		if (iter->line < DMA_DISASSEMBLY_VALID_ADDRESS)
		{
			if (iter->buffer->pending == NULL)
			{
				DmaSparseIter end;
				DmaSparseBufferTransport *trans;
				gint i, j;
				gulong start_adr;
				gulong end_adr;
				gint margin;
			
				/* If following line is define, get a block stopping here */
				dma_sparse_iter_copy (&end, iter);
				margin = 0;
				for (j = 0; j < DMA_DISASSEMBLY_BUFFER_BLOCK_SIZE / DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH; j++)
				{
					if (!dma_disassembly_iter_forward_line (&end))
					{
						end.offset = 0;
						end.base = dma_sparse_buffer_get_upper (end.buffer);
						break;
					}
					if (margin > DMA_DISASSEMBLY_SKIP_BEGINNING_LINE) break;
					if ((margin != 0) || (end.line >= DMA_DISASSEMBLY_VALID_ADDRESS)) margin++;
				}
				i = j;
				if (iter->line == DMA_DISASSEMBLY_UNKNOWN_ADDRESS)
				{
					for (i = j; i < DMA_DISASSEMBLY_BUFFER_BLOCK_SIZE / DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH; i++)
					{
						if (!dma_disassembly_iter_backward_line (iter)) break;
						if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS) break;
					}
				}
				start_adr = dma_sparse_iter_get_address (iter);
				end_adr = dma_sparse_iter_get_address (&end);
				trans = dma_sparse_buffer_alloc_transport (DMA_SPARSE_BUFFER (dis), i, 0);
				trans->tag = i != j ? DMA_DISASSEMBLY_SKIP_BEGINNING : DMA_DISASSEMBLY_KEEP_ALL;
				trans->start = start_adr;
				trans->length = end_adr - start_adr;
				if (end_adr == dma_sparse_buffer_get_upper (DMA_SPARSE_BUFFER (dis)))
				{
					trans->length++;
				}
				DEBUG_PRINT("get disassemble %lx %lx %ld trans %p buffer %p", start_adr, end_adr, trans->length, trans, trans->buffer);
				dma_queue_disassemble (dis->debugger, start_adr, end_adr + 1 - start_adr, (IAnjutaDebuggerCallback)on_disassemble, trans);
			}
		}
		else
		{
			/* Fill with known data */
			gtk_text_buffer_insert (buffer, dst, ((DmaDisassemblyBufferNode *)(iter->node))->data[iter->line].text, -1);
			
			return;
		}
	}
	
	/* Fill with unknow data */
	gtk_text_buffer_insert (buffer, dst, "??", 2);
}
Exemple #3
0
static gboolean
dma_disassembly_iter_refresh (DmaSparseIter *iter)
{
	/* Call this after updating node according to base */
	gint line = -1;
	DmaDisassemblyBufferNode *node = (DmaDisassemblyBufferNode *)iter->node;
	
	if (iter->node != NULL)
	{
		/* Find line corresponding to base */
		if ((iter->node->lower <= iter->base) && (iter->base <= iter->node->upper))
		{
			/* Iterator in current node */
			if ((iter->line >= 0) && (iter->line < ((DmaDisassemblyBufferNode *)iter->node)->size)
				&& (((DmaDisassemblyBufferNode *)iter->node)->data[iter->line].address == iter->base))
			{
				/* Already get the right node */
				line = iter->line;
			}
			else
			{
				/* Search for correct line */
			
				if (iter->offset >= 0)
				{
					for (line = 0; line < node->size; line++)
					{
						if (node->data[line].address >= iter->base) break;
					}
				}
				else
				{
					for (line = node->size - 1; line >= 0; line--)
					{
						if (node->data[line].address <= iter->base) break;
					}
				}

				if (node->data[line].address == iter->base)
				{
					iter->line = line;
				}
				else if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
				{
					iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
				}
			}
		}
		else if (iter->base == iter->node->upper + 1)
		{
			line = node->size;
			if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
			{
				iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
			}
		}
		else
		{
			/* Invalid base address */
			if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
			{
				iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
			}
		}
	}
	else
	{
		/* Invalid base address */
		if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
		{
			iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
		}
	}

	/* Try to reduce offset */
	if (line != -1)
	{
		if (iter->offset > 0)
		{
			/* Need to go upper if possible */
			guint up = (DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH + iter->offset - 1)/ DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;
			
			for (;;)
			{
				gint len = node->size - line;

				if (up < len)
				{
					iter->node = (DmaSparseBufferNode *)node;
					iter->line = line + up;
					iter->base = node->data[iter->line].address;
					iter->offset = 0;
					
					return TRUE;
				}

				if (iter->node->upper == dma_sparse_buffer_get_upper (iter->buffer))
				{
					gboolean move = iter->line != node->size - 1;
					
					iter->node = (DmaSparseBufferNode *)node;
					iter->line = node->size - 1;
					iter->base = node->data[iter->line].address;
					iter->offset = 0;
					
					return move;
				}

				up -= len;
				
				if ((node->parent.next == NULL) || (node->parent.upper != node->parent.next->lower - 1))
				{
					/* No following node */
					
					iter->node = (DmaSparseBufferNode *)node;
					iter->base = node->parent.upper + 1;
					iter->offset = up * DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;
					
					if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
					{
						iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
					}
					
					break;
				}

				node = (DmaDisassemblyBufferNode *)node->parent.next;
				line = 0;
			}
		}
		else if (iter->offset < 0)
		{
			/* Need to go down if possible */
			gint down = (- iter->offset) / DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;

			for (;;)
			{
				guint len = line;
				
				if (down <= len)
				{
					iter->node = (DmaSparseBufferNode *)node;
					iter->line = line - down;
					iter->base = node->data[iter->line].address;
					iter->offset = 0;
					
					return TRUE;
				}

				if (iter->node->lower == dma_sparse_buffer_get_lower (iter->buffer))
				{
					gboolean move = iter->line != 0;
					
					iter->node = (DmaSparseBufferNode *)node;
					iter->line = 0;
					iter->base = node->data[0].address;
					iter->offset = 0;
					
					return move;
				}

				down -= len;
				
				if ((node->parent.prev == NULL) || (node->parent.lower != node->parent.prev->upper + 1))
				{
					/* No following node */
						
					iter->node = (DmaSparseBufferNode *)node;
					iter->base = node->parent.lower;
					iter->offset = -down * DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;
					if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS)
					{
						iter->line = iter->offset == 0  ? DMA_DISASSEMBLY_KNOW_ADDRESS : DMA_DISASSEMBLY_UNKNOWN_ADDRESS;
					}
					break;
				}
				
				node = (DmaDisassemblyBufferNode *)node->parent.prev;
				line = node->size;
			}
		}
	}
	
	/* Round offset */
	if (iter->offset < 0)
	{
		gulong address;
		gboolean move = TRUE;
					
		address = iter->offset + iter->base;
		if ((address < dma_sparse_buffer_get_lower (iter->buffer)) || (address > iter->base))
		{
			address = dma_sparse_buffer_get_lower (iter->buffer);
			move = FALSE;
		}
		address -= address % DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;
		iter->offset = address - iter->base;
		
		return move;
	}		
	else if ((iter->offset > 0) || (iter->line == DMA_DISASSEMBLY_UNKNOWN_ADDRESS))
	{
		gulong address;
		gboolean move = TRUE;
					
		address = iter->offset + iter->base;
		if ((address > dma_sparse_buffer_get_upper (iter->buffer)) || (address < iter->base))
		{
			address = dma_sparse_buffer_get_upper (iter->buffer);
			move = FALSE;
		}
		address -= address % DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH;
		iter->offset = address - iter->base;
		
		return move;
	}
	
	/* return FALSE if iterator reach the lower or upper limit */
	return TRUE;
}