public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: frysk-core/frysk/dwfl:
@ 2008-01-15  2:14 mcvet
  0 siblings, 0 replies; only message in thread
From: mcvet @ 2008-01-15  2:14 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  d9d1870cc5ebfd5e4f99383b75b4f63b93c415e2 (commit)
       via  750377193aa5c58e31ac4a744681002ea11357ab (commit)
      from  bf27254471f894469bfcb05e6e39dc3a879ce345 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit d9d1870cc5ebfd5e4f99383b75b4f63b93c415e2
Author: varg <varg@warbird.(none)>
Date:   Mon Jan 14 21:13:47 2008 -0500

    frysk-core/frysk/dwfl:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* ElfSectionCache.java: Added.
    	* TestElfSectionCache.java: Added.
    
    frysk-core/frysk/hpd:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* StepInstructionCommand.java (interpret): Changed from iterating over
    	taskList to iterating over ptset, fixing a bug.
    
    frysk-core/frysk/pkglibdir:
    2007-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* funit-libcall.c: Added.
    
    frysk-core/frysk/stepping:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    	* InstructionStepThroughState.java: Added, fixing #5260.
    	* InstructionStepState.java (handleUpdate): Added code to
    	check if the PC is inside a PLT section, and then defer work to
    	above State. Fixes #5260.
    	* TestStepping.java (testInstructionStepThroughSection): Added.
    	* SteppingEngine.java (stepOut): Now requires Frames instead of
    	DebugInfoFrames.
    	(stepOut): Added, taking a State parameter for use from State classes.

commit 750377193aa5c58e31ac4a744681002ea11357ab
Author: varg <varg@warbird.(none)>
Date:   Mon Jan 14 21:11:46 2008 -0500

    frysk-core/frysk/dwfl:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* ElfSectionCache.java: Added.
    	* TestElfSectionCache.java: Added.
    
    frysk-core/frysk/hpd:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* StepInstructionCommand.java (interpret): Changed from iterating over
    	taskList to iterating over ptset, fixing a bug.
    
    frysk-core/frysk/pkglibdir:
    2007-01-14  Mike Cvet  <mcvet@redhat.com>
    
    	* funit-libcall.c: Added.
    
    frysk-core/frysk/stepping:
    2008-01-14  Mike Cvet  <mcvet@redhat.com>
    	* InstructionStepThroughState.java: Added, fixing #5260.
    	* InstructionStepState.java (handleUpdate): Added code to
    	check if the PC is inside a PLT section, and then defer work to
    	above State. Fixes #5260.
    	* TestStepping.java (testInstructionStepThroughSection): Added.
    	* SteppingEngine.java (stepOut): Now requires Frames instead of
    	DebugInfoFrames.
    	(stepOut): Added, taking a State parameter for use from State classes.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/dwfl/ChangeLog                    |    6 +-
 .../{TestDwflCache.java => ElfSectionCache.java}   |   74 ++++++++----
 .../TestElfSectionCache.java}                      |   34 ++++--
 frysk-core/frysk/hpd/ChangeLog                     |    5 +
 frysk-core/frysk/hpd/StepInstructionCommand.java   |    2 +-
 frysk-core/frysk/pkglibdir/ChangeLog               |    4 +-
 .../{funit-print-argc.c => funit-libcall.c}        |   19 +++-
 frysk-core/frysk/stepping/ChangeLog                |   10 ++
 .../frysk/stepping/InstructionStepState.java       |   41 +++++--
 ...State.java => InstructionStepThroughState.java} |  127 ++++++++++----------
 frysk-core/frysk/stepping/SteppingEngine.java      |   20 +++-
 frysk-core/frysk/stepping/TestStepping.java        |   69 +++++++++++
 12 files changed, 293 insertions(+), 118 deletions(-)
 copy frysk-core/frysk/dwfl/{TestDwflCache.java => ElfSectionCache.java} (58%)
 copy frysk-core/frysk/{testbed/TestCoreFileAtSignal.java => dwfl/TestElfSectionCache.java} (74%)
 copy frysk-core/frysk/pkglibdir/{funit-print-argc.c => funit-libcall.c} (90%)
 copy frysk-core/frysk/stepping/{StepOverTestState.java => InstructionStepThroughState.java} (53%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/dwfl/ChangeLog b/frysk-core/frysk/dwfl/ChangeLog
index 18ee8f2..4da4372 100644
--- a/frysk-core/frysk/dwfl/ChangeLog
+++ b/frysk-core/frysk/dwfl/ChangeLog
@@ -1,7 +1,7 @@
-2008-01-13  Stan Cox  <scox@redhat.com>
+2008-01-14  Mike Cvet  <mcvet@redhat.com>
 
-	* DwflCache.java (getSysRoot): New.
-	(getDwfl): Call it.
+	* ElfSectionCache.java: Added.
+	* TestElfSectionCache.java: Added.
 
 2007-10-18  Rick Moseley  <rmoseley@redhat.com>
 
diff --git a/frysk-core/frysk/dwfl/TestDwflCache.java b/frysk-core/frysk/dwfl/ElfSectionCache.java
similarity index 58%
copy from frysk-core/frysk/dwfl/TestDwflCache.java
copy to frysk-core/frysk/dwfl/ElfSectionCache.java
index d037994..b4d77f5 100644
--- a/frysk-core/frysk/dwfl/TestDwflCache.java
+++ b/frysk-core/frysk/dwfl/ElfSectionCache.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -39,33 +39,65 @@
 
 package frysk.dwfl;
 
-import frysk.testbed.TestLib;
-import frysk.testbed.SlaveOffspring;
+import java.util.WeakHashMap;
+
 import frysk.proc.Task;
 import lib.dwfl.Dwfl;
+import lib.dwfl.DwflModule;
+import lib.dwfl.Elf;
+import lib.dwfl.ElfSection;
+import lib.dwfl.ElfSectionHeader;
+import lib.dwfl.ModuleElfBias;
 
 /**
- * Tries to test the dwfl cache (which isn't easy since the cache can
- * drop things on the floor at any moment).
+ * Class to provide and cache requested ElfSectionHeaders based on name.
  */
-public class TestDwflCache
-    extends TestLib
-{
+public class ElfSectionCache {
+    
+    private Task task;
+    private WeakHashMap sectionMap;
+    
+    public ElfSectionCache (Task task) {
+	this.task = task;
+	this.sectionMap = new WeakHashMap();
+    }
+    
     /**
-     * Confirm that a second getDwfl for an un-changed task returns
-     * the original dwfl.
+     * Returns an ElfSectionHeader representing the ELF header for this class' Task object as
+     * given by the section name and module address in the parameters to this method. Also
+     * caches the headers in a WeakHashMap for later use.
+     * 
+     * @param name	The name of the section
+     * @param addr	The module address
+     * @return		The corresponding ElfSectionHeader
      */
-    public void testReGet() {
-	Task task = SlaveOffspring.createAttachedChild()
-	    .findTaskUsingRefresh(true);
-	Dwfl orig = DwflCache.getDwfl(task);
-	assertSame("orig vs getDwfl", orig, DwflCache.getDwfl(task));
+    public ElfSectionHeader getSectionHeader(String name, long addr) {
+	
+	if (this.sectionMap.containsKey(name))
+	    return (ElfSectionHeader) this.sectionMap.get(name);
+	
+	Dwfl dwfl = DwflCache.getDwfl(this.task);
+	DwflModule dwflModule = dwfl.getModule(addr);
+	ModuleElfBias elfBias = dwflModule.getElf();
+	Elf elf = elfBias.elf;
+	
+	for (ElfSection section = elf.getSection(0);
+	 section != null;
+	 section = elf.getNextSection(section)) {
+	    
+	    ElfSectionHeader sheader = section.getSectionHeader();
+	    if (sheader.name != null && sheader.name.equals(name)) {
+		
+		this.sectionMap.put(name, sheader);
+		return sheader;
+	    }
+	}
+	
+	return null;
     }
-    public void testClear() {
-	Task task = SlaveOffspring.createAttachedChild()
-	    .findTaskUsingRefresh(true);
-	Dwfl orig = DwflCache.getDwfl(task);
-	DwflCache.clear();
-	assertNotSame("orig vs getDwfl", orig, DwflCache.getDwfl(task));
+    
+    public Task getTask() {
+	return this.task;
     }
+
 }
diff --git a/frysk-core/frysk/testbed/TestCoreFileAtSignal.java b/frysk-core/frysk/dwfl/TestElfSectionCache.java
similarity index 74%
copy from frysk-core/frysk/testbed/TestCoreFileAtSignal.java
copy to frysk-core/frysk/dwfl/TestElfSectionCache.java
index c4ed8f6..e0b7355 100644
--- a/frysk-core/frysk/testbed/TestCoreFileAtSignal.java
+++ b/frysk-core/frysk/dwfl/TestElfSectionCache.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007 Red Hat Inc.
+// Copyright 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -37,22 +37,30 @@
 // version and license this file solely under the GPL without
 // exception.
 
-package frysk.testbed;
+package frysk.dwfl;
 
-import java.io.File;
+import lib.dwfl.ElfSectionHeader;
 import frysk.Config;
-import frysk.proc.Proc;
-import frysk.util.Util;
 import frysk.proc.Task;
+import frysk.testbed.DaemonBlockedAtEntry;
+import frysk.testbed.TestLib;
 
-public class TestCoreFileAtSignal extends TestLib {
-    public void testCoreFileAtSignal() {
-	File coreExe = Config.getPkgLibFile("funit-asm");
-	File coreFile = CoreFileAtSignal.constructCore(coreExe);
-	Proc coreProc = Util.getProcFromCoreFile(coreFile, coreExe);
-	Task coreTask = coreProc.getMainTask();
-	FryskAsm regs = FryskAsm.createFryskAsm(coreTask.getISA());
-	assertEquals("REG0", 1, coreTask.getRegister(regs.REG0));
+public class TestElfSectionCache extends TestLib {
+    
+    public void testGetSectionHeader() {
+	
+	DaemonBlockedAtEntry dbae = new DaemonBlockedAtEntry(Config.getPkgLibFile("funit-libcall"));
+	Task task = dbae.getMainTask();
+	
+	long addr = task.getPC();
+	ElfSectionCache e = new ElfSectionCache(task);
+	
+	ElfSectionHeader plt = e.getSectionHeader(".plt", addr);
+	
+	assertTrue("Section not null", (plt != null));
+	assertTrue("Section name not null", (plt.name != null));
+	assertTrue("Section addr not zero", (plt.addr != 0));
+	assertTrue("Section offset not zero", (plt.offset != 0));
     }
 
 }
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index c8458e9..1b3321d 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-14  Mike Cvet  <mcvet@redhat.com>
+
+	* StepInstructionCommand.java (interpret): Changed from iterating over
+	taskList to iterating over ptset, fixing a bug.
+
 2008-01-13  Stan Cox  <scox@redhat.com>
 
 	* DbgVariables.java (DbgVariables): Make public.
diff --git a/frysk-core/frysk/hpd/StepInstructionCommand.java b/frysk-core/frysk/hpd/StepInstructionCommand.java
index 42d55e8..f683f1d 100644
--- a/frysk-core/frysk/hpd/StepInstructionCommand.java
+++ b/frysk-core/frysk/hpd/StepInstructionCommand.java
@@ -70,7 +70,7 @@ public class StepInstructionCommand extends ParameterizedCommand {
 		} catch (InterruptedException ie) {
 		}
 	    }
-	    Iterator stepped = taskList.iterator();
+	    Iterator stepped = ptset.getTasks();
 	    while (stepped.hasNext()) {
 		Task task = (Task) stepped.next();
 		DebugInfoFrame rf = cli.getTaskFrame(task);
diff --git a/frysk-core/frysk/pkglibdir/ChangeLog b/frysk-core/frysk/pkglibdir/ChangeLog
index 746ddea..d5a77c2 100644
--- a/frysk-core/frysk/pkglibdir/ChangeLog
+++ b/frysk-core/frysk/pkglibdir/ChangeLog
@@ -1,6 +1,6 @@
-2008-01-14  Teresa Thomas  <tthomas@redhat.com>
+2007-01-14  Mike Cvet  <mcvet@redhat.com>
 
-	* funit-location.S: Set REG3 for tests.
+	* funit-libcall.c: Added.
 
 2007-01-04  Nurdin Premji  <npremji@redhat.com>
 	* funit-complex-class.cxx: New
diff --git a/frysk-core/frysk/pkglibdir/funit-print-argc.c b/frysk-core/frysk/pkglibdir/funit-libcall.c
similarity index 90%
copy from frysk-core/frysk/pkglibdir/funit-print-argc.c
copy to frysk-core/frysk/pkglibdir/funit-libcall.c
index 47a5081..578b0a2 100644
--- a/frysk-core/frysk/pkglibdir/funit-print-argc.c
+++ b/frysk-core/frysk/pkglibdir/funit-libcall.c
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2005, 2006, Red Hat Inc.
+// Copyright 2008 Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -37,11 +37,22 @@
 // version and license this file solely under the GPL without
 // exception.
 
-#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+static volatile long tmp = 0;
+
+void
+foo ()
+{
+  struct timeval t;
+  gettimeofday (&t, NULL); // _testIStepThrough_
+  tmp += t.tv_usec;
+}
 
 int
 main (int argc, char **argv)
 {
-  printf ("%d\n", argc);
-  return 0;
+  foo ();
+  exit (0);
 }
diff --git a/frysk-core/frysk/stepping/ChangeLog b/frysk-core/frysk/stepping/ChangeLog
index 2abd271..2f37e23 100644
--- a/frysk-core/frysk/stepping/ChangeLog
+++ b/frysk-core/frysk/stepping/ChangeLog
@@ -1,3 +1,13 @@
+2008-01-14  Mike Cvet  <mcvet@redhat.com>
+	* InstructionStepThroughState.java: Added, fixing #5260.
+	* InstructionStepState.java (handleUpdate): Added code to
+	check if the PC is inside a PLT section, and then defer work to
+	above State. Fixes #5260.
+	* TestStepping.java (testInstructionStepThroughSection): Added.
+	* SteppingEngine.java (stepOut): Now requires Frames instead of
+	DebugInfoFrames.
+	(stepOut): Added, taking a State parameter for use from State classes.
+
 2008-01-07  Andrew Cagney  <cagney@redhat.com>
 
 	* SteppingEngine.java: Update; use Task.getPC().
diff --git a/frysk-core/frysk/stepping/InstructionStepState.java b/frysk-core/frysk/stepping/InstructionStepState.java
index 9557a77..4baea23 100644
--- a/frysk-core/frysk/stepping/InstructionStepState.java
+++ b/frysk-core/frysk/stepping/InstructionStepState.java
@@ -39,23 +39,48 @@
 
 package frysk.stepping;
 
+import frysk.dwfl.ElfSectionCache;
 import frysk.proc.Task;
+import lib.dwfl.DwflLine;
+import lib.dwfl.ElfSectionHeader;
 
 public class InstructionStepState extends State {
+
+    private ElfSectionCache elfCache;
+    private final String PLT_DL_FIXUP = "_dl_fixup";
+
     public InstructionStepState(Task task) {
 	this.task = task;
     }
 
     /**
-         * When the instruction observer from SteppingEngine returns, a single
-         * step has been performed. All that is left to do is to reset the State
-         * for this Task back to a StoppedState.
-         * 
-         * @param tse
-         *                The TaskStepEngine for this State.
-         * @return new StoppedState
-         */
+     * When the instruction observer from SteppingEngine returns, a single
+     * step has been performed. All that is left to do is to reset the State
+     * for this Task back to a StoppedState.
+     * 
+     * @param tse
+     *                The TaskStepEngine for this State.
+     * @return new StoppedState
+     */
     public State handleUpdate(TaskStepEngine tse) {
+
+	long addr = this.task.getPC();
+	this.elfCache = new ElfSectionCache(this.task);
+	ElfSectionHeader header = this.elfCache.getSectionHeader(".plt", addr);
+
+	/* If the user steps into a function call, the following catches the .plt section of the program, and
+	 * ensures that Frysk steps past it, so that the user is landed back into their own code after the call. */
+	if ((header != null && header.addr <= addr && (header.addr + header.offset) >= addr)
+		&& (header.type == ElfSectionHeader.ELF_SHT_PROGBITS || header.type == ElfSectionHeader.ELF_SHT_NOBITS)) {
+
+	    DwflLine line = tse.getDwflLine();
+
+	    if (line == null) {
+		tse.getSteppingEngine().continueForStepping(this.task, true);
+		return new InstructionStepThroughState(task, PLT_DL_FIXUP);
+	    }
+	}
+
 	return new StoppedState(this.task);
     }
 
diff --git a/frysk-core/frysk/stepping/StepOverTestState.java b/frysk-core/frysk/stepping/InstructionStepThroughState.java
similarity index 53%
copy from frysk-core/frysk/stepping/StepOverTestState.java
copy to frysk-core/frysk/stepping/InstructionStepThroughState.java
index 8664bb4..9722127 100644
--- a/frysk-core/frysk/stepping/StepOverTestState.java
+++ b/frysk-core/frysk/stepping/InstructionStepThroughState.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -39,89 +39,88 @@
 
 package frysk.stepping;
 
-//import java.io.PrintWriter;
-
 import lib.dwfl.DwflLine;
 import frysk.proc.Task;
 import frysk.stack.Frame;
 import frysk.stack.StackFactory;
 
-public class StepOverTestState extends State {
-    public StepOverTestState(Task task) {
+public class InstructionStepThroughState extends State {
+
+    private String name;
+    private int steppingOut = 0;
+
+    public InstructionStepThroughState(Task task) {
+	this.task = task;
+	this.name = null;
+    }
+
+    public InstructionStepThroughState(Task task, String name) {
 	this.task = task;
+	this.name = name;
     }
 
     /**
-     * Begins the process of stepping-over a line for a Task. Continues to
-     * step instructions until the line changes. If, when that happens, the
-     * Task is still in the same frame as before, simply stops the stepping
-     * and treats the operation as a line step. Otherwise, sets a breakpoint
-     * and runs the Task until it returns.
+     * State used to represent when a task has entered some section of the program (such
+     * as a .plt section) which must be carefully stepped through.
      * 
      * @param tse
-     *                The parent TaskStepEngine
-     * @return new StoppedState If there was no frame change
-     * @return new StepOverState If the frame changed with the line
-     * @return this If the line has not changed yet
+     *                The TaskStepEngine for this State.
+     * @return this	If more stepping needs to be done.
+     * @return StoppedState	If we have returned to user code. 
      */
     public State handleUpdate(TaskStepEngine tse) {
-	DwflLine line = tse.getDwflLine();
-
-	int lineNum;
-
-	if (line == null) /* We're in no-debuginfo land */
-	    lineNum = 0;
-	else
-	    lineNum = line.getLineNum();
-
-	int prev = tse.getLine();
-
-	if (lineNum != prev) {
-	    tse.setLine(lineNum);
-	    Frame newFrame = StackFactory.createFrame(this.task);
-
-	    if (newFrame.getFrameIdentifier().innerTo(tse.getFrameIdentifier())) {
-		/*
-		 * There is a different innermost frame on the stack - run until
-		 * it exits - success!
-		 */
-		Frame frame = newFrame.getOuter();
-		tse.getSteppingEngine().setBreakpoint(this.task,
-			frame.getAddress());
-		return new StepOverState(this.task);
-	    }
-	    /*
-	     * The two frames are the same or we've actually stepped over a
-	     * frame return; treat this step-over as an instruction step.
-	     */
-	    else if (newFrame.getFrameIdentifier().equals(
-		    tse.getFrameIdentifier())) {
-		tse.getSteppingEngine().removeBreakpoint(this.task);
-		return new StoppedState(this.task);
-
-	    } else if (newFrame.getFrameIdentifier().outerTo(
-		    tse.getFrameIdentifier())) {
-		tse.getSteppingEngine().removeBreakpoint(this.task);
-		return new StoppedState(this.task);
 
-	    } else {
-		/* Leaf function */
-		if (newFrame.getOuter().getFrameIdentifier().equals(
-			tse.getFrameIdentifier())) {
+	Frame frame = StackFactory.createFrame(task);
+	
+	/* This object has already performed a step-out operation on the task.
+	 * Here, clean up and perform another to return to user code. */
+	if (this.steppingOut == 1) {
+
+	    this.steppingOut = 2;
+	    tse.getSteppingEngine().removeBreakpoint(this.task);
+	    
+	    /* Here, we're back in  _dl_runtime_resolve - step out of this as well. */
+	    tse.getSteppingEngine().stepOut(this.task, frame, this); 
+	    return this;
+	    
+	} else if (this.steppingOut == 2) {
+	    
+	    this.steppingOut = 0;
+	    tse.getSteppingEngine().removeBreakpoint(this.task);
+	}
 
-		    Frame frame = newFrame.getOuter();
-		    tse.getSteppingEngine().setBreakpoint(this.task,
-			    frame.getAddress());
+	/* The frame being searched for has been reached. Perform a step-out. */
+	if (frame.getSymbol().getDemangledName().equals(this.name)) {
+	    
+	    this.steppingOut = 1;
+	    tse.getSteppingEngine().stepOut(this.task, frame, this);
+	    return this;
 
-		    return new StepOverState(this.task);
+	} else if (frame.getSymbol().getDemangledName().contains("_start")) {
+	    /* Avoid handling any code having to do with the initialization of a process */
+	    
+	    return new StoppedState(this.task);
+	    
+	} else {
+	    
+	    /* Inside some code without debuginfo, and isn't the function we're interested in.
+	     * Continue stepping through it. */
+	    if (tse.getLine() == 0) {
+		
+		DwflLine line = tse.getDwflLine();
+
+		if (line == null) {
+		    tse.getSteppingEngine()
+			    .continueForStepping(this.task, true);
+		    return this;
 		} else {
-		    tse.getSteppingEngine().removeBreakpoint(this.task);
+		    /* Back in debuginfo. Finish the stepping operation. */
 		    return new StoppedState(this.task);
 		}
+	    } else {
+		/* Back in debuginfo. Finish the stepping operation. */
+		return new StoppedState(this.task);
 	    }
-	} else {
-	    tse.getSteppingEngine().continueForStepping(this.task, true);
-	    return this;
 	}
     }
 


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-01-15  2:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-15  2:14 [SCM] master: frysk-core/frysk/dwfl: mcvet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).