ckaestne / kconfigreader

KConfigReader - accurate translation of kconfig files to propositional formulas
7 stars 9 forks source link

What version of the kernel does dumpconf work with? #2

Open matachi opened 8 years ago

matachi commented 8 years ago

I have compiled dumpconf using the make.sh script against the kernel source tree I have downloaded. The version of it is:

$ make kernelversion
4.4.0-rc2

However, when I then tried to run kconfigreader, it crashed with the following error:

$ ./run.sh de.fosd.typechef.kconfig.KConfigReader ../linux/Kconfig out
dumping model
setting archusing arch x86
reading model
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
  at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1437)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1019)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
  at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
  at scala.xml.factory.XMLLoader$class.loadXML(XMLLoader.scala:41)
  at scala.xml.XML$.loadXML(XML.scala:60)
  at scala.xml.factory.XMLLoader$class.load(XMLLoader.scala:54)
  at scala.xml.XML$.load(XML.scala:60)
  at de.fosd.typechef.kconfig.XMLDumpReader.readRSF(XMLDumpReader.scala:34)
  at de.fosd.typechef.kconfig.KConfigReader$.delayedEndpoint$de$fosd$typechef$kconfig$KConfigReader$1(KConfigReader.scala:81)
  at de.fosd.typechef.kconfig.KConfigReader$delayedInit$body.apply(KConfigReader.scala:21)
  at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
  at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
  at scala.App$$anonfun$main$1.apply(App.scala:76)
  at scala.App$$anonfun$main$1.apply(App.scala:76)
  at scala.collection.immutable.List.foreach(List.scala:381)
  at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
  at scala.App$class.main(App.scala:76)
  at de.fosd.typechef.kconfig.KConfigReader$.main(KConfigReader.scala:21)
  at de.fosd.typechef.kconfig.KConfigReader.main(KConfigReader.scala)

Which I assume is due to the content of out.rsf:

$ cat out.rsf 
../linux/Kconfig:11: can't open file "arch/x86/Kconfig"

When running only dumpconf, I'm getting the same error:

$ ./binary/dumpconf ../linux/Kconfig 
setting archusing arch x86
../linux/Kconfig:11: can't open file "arch/x86/Kconfig"

So it's obvious that dumpconf doesn't behave correctly. Is it because the kernel version is too new? I have tried against 3.6.0 too, and it neither worked. What version are you using it against?

Thanks, Daniel

matachi commented 8 years ago

It seems that the reason why dumpconf is throwing can't open file "arch/x86/Kconfig" is because it doesn't understand when the current working directory is not the Linux source directory:

~/dev/kconfigreader$ binary/dumpconf ../linux/Kconfig
setting archusing arch x86
../linux/Kconfig:11: can't open file "arch/x86/Kconfig"
~/dev/kconfigreader$ cd ../linux
~/dev/linux$ ../kconfigreader/binary/dumpconf Kconfig
.
<submenu>
<menu flags="1">
<symbol type="string" flags="46464" id="37009792">
<name>SRCARCH</name>
<property type="?"><expr>S@37009792</expr></property>
<property type="env"><expr>'SRCARCH'</expr></property>
<property type="default"><expr>'x86'</expr></property>
</symbol>
</menu>
<menu flags="0">
<symbol type="boolean" flags="41216" id="37028208">
<name>64BIT</name>
...

So I manually generated the out.rsf file by executing ~/dev/linux$ ../kconfigreader/binary/dumpconf Kconfig > ../kconfigreader/out.rsf. I then deleted the dumpconf step from KConfigReader so it wouldn't overwrite it with an empty file:

diff --git a/src/main/scala/KConfigReader.scala b/src/main/scala/KConfigReader.scala
index ffe507e..99f85b8 100644
--- a/src/main/scala/KConfigReader.scala
+++ b/src/main/scala/KConfigReader.scala
@@ -61,7 +61,6 @@ object KConfigReader extends App {
     val kconfigPath = options("kconfigpath")
     val out = options("out")

-    val kconfigFile = new File(kconfigPath)
     val rsfFile = new File(out + ".rsf")
     val modelFile = new File(out + ".model")
     val dimacsFile = new File(out + ".dimacs")
@@ -70,12 +69,6 @@ object KConfigReader extends App {
     val openFeatureListFile = new File(out + ".open")
     val updatedDimacsFile = new File(out + ".dimacs.2")

-    assert(kconfigFile.exists(), "kconfig file does not exist")
-
-    //creating .rsf file
-    println("dumping model")
-    Process(dumpconf + " %s > %s".format(kconfigFile, rsfFile)).#>(rsfFile).!
-
     //reading model
     println("reading model")
     val model = new XMLDumpReader().readRSF(rsfFile)

And now it's working:

~/dev/kconfigreader$ ./run.sh de.fosd.typechef.kconfig.KConfigReader --writeDimacs Kconfig out
reading model
getting constraints
Warning: 'SGI_IP32'=y will always evaluate to false
Warning: 'SGI_IP32'=y will always evaluate to false
Warning: 'SIBYTE_SB1xxx_SOC'=y will always evaluate to false
Warning: 'SIBYTE_SB1xxx_SOC'=y will always evaluate to false
Warning: 'SIBYTE_SB1xxx_SOC'=y will always evaluate to false
Warning: 'SIBYTE_SB1xxx_SOC'=y will always evaluate to false
Warning: 'CPU_DCACHE_DISABLE'=n will always evaluate to false
Warning: 'CPU_DCACHE_DISABLE'=n will always evaluate to false
checking combined constraint
writing model
writing dimacs

It's at least a working workaround.