 12b3540547
			
		
	
	
		12b3540547
		
	
	
	
	
		
			
			This includes GDB hooks for reading from wnd wrtiting to AVR registers, and xml register definition file as well. [AM: Split a larger AVR introduction patch into logical units] Suggested-by: Aleksandar Markovic <aleksandar.m.mail@gmail.com> Co-developed-by: Michael Rolnik <mrolnik@gmail.com> Co-developed-by: Sarah Harris <S.E.Harris@kent.ac.uk> Signed-off-by: Michael Rolnik <mrolnik@gmail.com> Signed-off-by: Sarah Harris <S.E.Harris@kent.ac.uk> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Aleksandar Markovic <aleksandar.m.mail@gmail.com> Acked-by: Igor Mammedov <imammedo@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> [thuth: Fixed avr_cpu_gdb_read_register() parameter] Signed-off-by: Thomas Huth <huth@tuxfamily.org> Message-Id: <20200705140315.260514-7-huth@tuxfamily.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * QEMU AVR gdbstub
 | |
|  *
 | |
|  * Copyright (c) 2016-2020 Michael Rolnik
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2.1 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library; if not, see
 | |
|  * <http://www.gnu.org/licenses/lgpl-2.1.html>
 | |
|  */
 | |
| 
 | |
| #include "qemu/osdep.h"
 | |
| #include "exec/gdbstub.h"
 | |
| 
 | |
| int avr_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
 | |
| {
 | |
|     AVRCPU *cpu = AVR_CPU(cs);
 | |
|     CPUAVRState *env = &cpu->env;
 | |
| 
 | |
|     /*  R */
 | |
|     if (n < 32) {
 | |
|         return gdb_get_reg8(mem_buf, env->r[n]);
 | |
|     }
 | |
| 
 | |
|     /*  SREG */
 | |
|     if (n == 32) {
 | |
|         uint8_t sreg = cpu_get_sreg(env);
 | |
| 
 | |
|         return gdb_get_reg8(mem_buf, sreg);
 | |
|     }
 | |
| 
 | |
|     /*  SP */
 | |
|     if (n == 33) {
 | |
|         return gdb_get_reg16(mem_buf, env->sp & 0x0000ffff);
 | |
|     }
 | |
| 
 | |
|     /*  PC */
 | |
|     if (n == 34) {
 | |
|         return gdb_get_reg32(mem_buf, env->pc_w * 2);
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| int avr_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
 | |
| {
 | |
|     AVRCPU *cpu = AVR_CPU(cs);
 | |
|     CPUAVRState *env = &cpu->env;
 | |
| 
 | |
|     /*  R */
 | |
|     if (n < 32) {
 | |
|         env->r[n] = *mem_buf;
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     /*  SREG */
 | |
|     if (n == 32) {
 | |
|         cpu_set_sreg(env, *mem_buf);
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     /*  SP */
 | |
|     if (n == 33) {
 | |
|         env->sp = lduw_p(mem_buf);
 | |
|         return 2;
 | |
|     }
 | |
| 
 | |
|     /*  PC */
 | |
|     if (n == 34) {
 | |
|         env->pc_w = ldl_p(mem_buf) / 2;
 | |
|         return 4;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 |