Commit 224f9fd4 authored by Richard Henderson's avatar Richard Henderson
Browse files

tcg-ppc: Merge cache-utils into the backend



As a "utility", it only supported ppc, and in a way that other
tcg backends provided directly in tcg-target.h.  Removing this
disparity is easier now that the two ppc backends are merged.

Tested-by: default avatarTom Musta <tommusta@gmail.com>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent 2b45c3f5
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@

#include "exec/memory-internal.h"
#include "exec/ram_addr.h"
#include "qemu/cache-utils.h"

#include "qemu/range.h"

include/qemu/cache-utils.h

deleted100644 → 0
+0 −44
Original line number Diff line number Diff line
#ifndef QEMU_CACHE_UTILS_H
#define QEMU_CACHE_UTILS_H

#if defined(_ARCH_PPC)

#include <stdint.h> /* uintptr_t */

struct qemu_cache_conf {
    unsigned long dcache_bsize;
    unsigned long icache_bsize;
};

extern struct qemu_cache_conf qemu_cache_conf;

void qemu_cache_utils_init(void);

/* mildly adjusted code from tcg-dyngen.c */
static inline void flush_icache_range(uintptr_t start, uintptr_t stop)
{
    unsigned long p, start1, stop1;
    unsigned long dsize = qemu_cache_conf.dcache_bsize;
    unsigned long isize = qemu_cache_conf.icache_bsize;

    start1 = start & ~(dsize - 1);
    stop1 = (stop + dsize - 1) & ~(dsize - 1);
    for (p = start1; p < stop1; p += dsize) {
        asm volatile ("dcbst 0,%0" : : "r"(p) : "memory");
    }
    asm volatile ("sync" : : : "memory");

    start &= start & ~(isize - 1);
    stop1 = (stop + isize - 1) & ~(isize - 1);
    for (p = start1; p < stop1; p += isize) {
        asm volatile ("icbi 0,%0" : : "r"(p) : "memory");
    }
    asm volatile ("sync" : : : "memory");
    asm volatile ("isync" : : : "memory");
}

#else
#define qemu_cache_utils_init() do { } while (0)
#endif

#endif /* QEMU_CACHE_UTILS_H */
+0 −3
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@

#include "qemu.h"
#include "qemu-common.h"
#include "qemu/cache-utils.h"
#include "cpu.h"
#include "tcg.h"
#include "qemu/timer.h"
@@ -3829,8 +3828,6 @@ int main(int argc, char **argv, char **envp)

    module_call_init(MODULE_INIT_QOM);

    qemu_cache_utils_init();

    if ((envlist = envlist_create()) == NULL) {
        (void) fprintf(stderr, "Unable to allocate envlist\n");
        exit(1);
+96 −0
Original line number Diff line number Diff line
@@ -2538,3 +2538,99 @@ void tcg_register_jit(void *buf, size_t buf_size)
    tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame));
}
#endif /* __ELF__ */

static size_t dcache_bsize = 16;
static size_t icache_bsize = 16;

void flush_icache_range(uintptr_t start, uintptr_t stop)
{
    uintptr_t p, start1, stop1;
    size_t dsize = dcache_bsize;
    size_t isize = icache_bsize;

    start1 = start & ~(dsize - 1);
    stop1 = (stop + dsize - 1) & ~(dsize - 1);
    for (p = start1; p < stop1; p += dsize) {
        asm volatile ("dcbst 0,%0" : : "r"(p) : "memory");
    }
    asm volatile ("sync" : : : "memory");

    start &= start & ~(isize - 1);
    stop1 = (stop + isize - 1) & ~(isize - 1);
    for (p = start1; p < stop1; p += isize) {
        asm volatile ("icbi 0,%0" : : "r"(p) : "memory");
    }
    asm volatile ("sync" : : : "memory");
    asm volatile ("isync" : : : "memory");
}

#if defined _AIX
#include <sys/systemcfg.h>

static void __attribute__((constructor)) tcg_cache_init(void)
{
    icache_bsize = _system_configuration.icache_line;
    dcache_bsize = _system_configuration.dcache_line;
}

#elif defined __linux__
static void __attribute__((constructor)) tcg_cache_init(void)
{
    unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
    unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);

    if (dsize == 0 || isize == 0) {
        if (dsize == 0) {
            fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
        }
        if (isize == 0) {
            fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
        }
        exit(1);
    }
    dcache_bsize = dsize;
    icache_bsize = isize;
}

#elif defined __APPLE__
#include <stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>

static void __attribute__((constructor)) tcg_cache_init(void)
{
    size_t len;
    unsigned cacheline;
    int name[2] = { CTL_HW, HW_CACHELINE };

    len = sizeof(cacheline);
    if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
        perror("sysctl CTL_HW HW_CACHELINE failed");
        exit(1);
    }
    dcache_bsize = cacheline;
    icache_bsize = cacheline;
}

#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/sysctl.h>

static void __attribute__((constructor)) tcg_cache_init(void)
{
    size_t len = 4;
    unsigned cacheline;

    if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
        fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
                strerror(errno));
        exit(1);
    }
    dcache_bsize = cacheline;
    icache_bsize = cacheline;
}
#endif
+2 −0
Original line number Diff line number Diff line
@@ -106,4 +106,6 @@ typedef enum {
#define TCG_TARGET_HAS_mulsh_i64        1
#endif

void flush_icache_range(uintptr_t start, uintptr_t stop);

#endif
Loading