1903 |
1903 |
return data.err;
|
1904 |
1904 |
}
|
1905 |
1905 |
|
1906 |
|
int kvm_insert_breakpoint(CPUArchState *current_env, target_ulong addr,
|
|
1906 |
int kvm_insert_breakpoint(CPUArchState *env, target_ulong addr,
|
1907 |
1907 |
target_ulong len, int type)
|
1908 |
1908 |
{
|
1909 |
|
CPUState *current_cpu = ENV_GET_CPU(current_env);
|
|
1909 |
CPUState *cpu = ENV_GET_CPU(env);
|
1910 |
1910 |
struct kvm_sw_breakpoint *bp;
|
1911 |
|
CPUArchState *env;
|
1912 |
1911 |
int err;
|
1913 |
1912 |
|
1914 |
1913 |
if (type == GDB_BREAKPOINT_SW) {
|
1915 |
|
bp = kvm_find_sw_breakpoint(current_cpu, addr);
|
|
1914 |
bp = kvm_find_sw_breakpoint(cpu, addr);
|
1916 |
1915 |
if (bp) {
|
1917 |
1916 |
bp->use_count++;
|
1918 |
1917 |
return 0;
|
... | ... | |
1925 |
1924 |
|
1926 |
1925 |
bp->pc = addr;
|
1927 |
1926 |
bp->use_count = 1;
|
1928 |
|
err = kvm_arch_insert_sw_breakpoint(current_cpu, bp);
|
|
1927 |
err = kvm_arch_insert_sw_breakpoint(cpu, bp);
|
1929 |
1928 |
if (err) {
|
1930 |
1929 |
g_free(bp);
|
1931 |
1930 |
return err;
|
1932 |
1931 |
}
|
1933 |
1932 |
|
1934 |
|
QTAILQ_INSERT_HEAD(¤t_cpu->kvm_state->kvm_sw_breakpoints,
|
1935 |
|
bp, entry);
|
|
1933 |
QTAILQ_INSERT_HEAD(&cpu->kvm_state->kvm_sw_breakpoints, bp, entry);
|
1936 |
1934 |
} else {
|
1937 |
1935 |
err = kvm_arch_insert_hw_breakpoint(addr, len, type);
|
1938 |
1936 |
if (err) {
|
... | ... | |
1949 |
1947 |
return 0;
|
1950 |
1948 |
}
|
1951 |
1949 |
|
1952 |
|
int kvm_remove_breakpoint(CPUArchState *current_env, target_ulong addr,
|
|
1950 |
int kvm_remove_breakpoint(CPUArchState *env, target_ulong addr,
|
1953 |
1951 |
target_ulong len, int type)
|
1954 |
1952 |
{
|
1955 |
|
CPUState *current_cpu = ENV_GET_CPU(current_env);
|
|
1953 |
CPUState *cpu = ENV_GET_CPU(env);
|
1956 |
1954 |
struct kvm_sw_breakpoint *bp;
|
1957 |
|
CPUArchState *env;
|
1958 |
1955 |
int err;
|
1959 |
1956 |
|
1960 |
1957 |
if (type == GDB_BREAKPOINT_SW) {
|
1961 |
|
bp = kvm_find_sw_breakpoint(current_cpu, addr);
|
|
1958 |
bp = kvm_find_sw_breakpoint(cpu, addr);
|
1962 |
1959 |
if (!bp) {
|
1963 |
1960 |
return -ENOENT;
|
1964 |
1961 |
}
|
... | ... | |
1968 |
1965 |
return 0;
|
1969 |
1966 |
}
|
1970 |
1967 |
|
1971 |
|
err = kvm_arch_remove_sw_breakpoint(current_cpu, bp);
|
|
1968 |
err = kvm_arch_remove_sw_breakpoint(cpu, bp);
|
1972 |
1969 |
if (err) {
|
1973 |
1970 |
return err;
|
1974 |
1971 |
}
|
1975 |
1972 |
|
1976 |
|
QTAILQ_REMOVE(¤t_cpu->kvm_state->kvm_sw_breakpoints, bp, entry);
|
|
1973 |
QTAILQ_REMOVE(&cpu->kvm_state->kvm_sw_breakpoints, bp, entry);
|
1977 |
1974 |
g_free(bp);
|
1978 |
1975 |
} else {
|
1979 |
1976 |
err = kvm_arch_remove_hw_breakpoint(addr, len, type);
|
... | ... | |
1991 |
1988 |
return 0;
|
1992 |
1989 |
}
|
1993 |
1990 |
|
1994 |
|
void kvm_remove_all_breakpoints(CPUArchState *current_env)
|
|
1991 |
void kvm_remove_all_breakpoints(CPUArchState *env)
|
1995 |
1992 |
{
|
1996 |
|
CPUState *current_cpu = ENV_GET_CPU(current_env);
|
|
1993 |
CPUState *cpu = ENV_GET_CPU(env);
|
1997 |
1994 |
struct kvm_sw_breakpoint *bp, *next;
|
1998 |
|
KVMState *s = current_cpu->kvm_state;
|
1999 |
|
CPUArchState *env;
|
2000 |
|
CPUState *cpu;
|
|
1995 |
KVMState *s = cpu->kvm_state;
|
2001 |
1996 |
|
2002 |
1997 |
QTAILQ_FOREACH_SAFE(bp, &s->kvm_sw_breakpoints, entry, next) {
|
2003 |
|
if (kvm_arch_remove_sw_breakpoint(current_cpu, bp) != 0) {
|
|
1998 |
if (kvm_arch_remove_sw_breakpoint(cpu, bp) != 0) {
|
2004 |
1999 |
/* Try harder to find a CPU that currently sees the breakpoint. */
|
2005 |
2000 |
for (env = first_cpu; env != NULL; env = env->next_cpu) {
|
2006 |
2001 |
cpu = ENV_GET_CPU(env);
|
... | ... | |
2026 |
2021 |
return -EINVAL;
|
2027 |
2022 |
}
|
2028 |
2023 |
|
2029 |
|
int kvm_insert_breakpoint(CPUArchState *current_env, target_ulong addr,
|
|
2024 |
int kvm_insert_breakpoint(CPUArchState *env, target_ulong addr,
|
2030 |
2025 |
target_ulong len, int type)
|
2031 |
2026 |
{
|
2032 |
2027 |
return -EINVAL;
|
2033 |
2028 |
}
|
2034 |
2029 |
|
2035 |
|
int kvm_remove_breakpoint(CPUArchState *current_env, target_ulong addr,
|
|
2030 |
int kvm_remove_breakpoint(CPUArchState *env, target_ulong addr,
|
2036 |
2031 |
target_ulong len, int type)
|
2037 |
2032 |
{
|
2038 |
2033 |
return -EINVAL;
|
2039 |
2034 |
}
|
2040 |
2035 |
|
2041 |
|
void kvm_remove_all_breakpoints(CPUArchState *current_env)
|
|
2036 |
void kvm_remove_all_breakpoints(CPUArchState *env)
|
2042 |
2037 |
{
|
2043 |
2038 |
}
|
2044 |
2039 |
#endif /* !KVM_CAP_SET_GUEST_DEBUG */
|